计算总和并作为行插入

Calculate Sum and Insert as Row

我使用 SSIS 引入了在输出中包含此内容的原始文本文件:

我稍后会使用此数据进行报告。关键列得到旋转。但是,我不想单独显示所有这些列,我只想显示总数。 为此,我的想法是使用触发器计算插入时的总和,然后将总和作为新行插入到数据中。

输出类似于:

我想做的事情可行吗?有没有更好的方法在 pivot 上动态地执行此操作?需要明确的是,我不只是为报告旋转这些行,还有其他不需要计算总和的行。

我将向您展示一种方法,但我不建议将总计添加到详细数据的末尾。如果您要报告它,请将其显示为总数。

源后添加数据转换:

C#

  1. 向您的数据流添加两列:大小为 int,类型为字符串

  2. Select 值为只读

代码如下:

string[] splits = Row.value.ToString().Split(' '); //Make sure single quote for char
int goodValue;

if(Int32.TryParse(splits[0], out goodValue))
{
   Row.Size = goodValue;
   Row.Type = "GB";
}
else
{
   Row.Size = 0;
   Row.Type="None";
}

现在您的数据具有正确的数据类型,可以在 table 中进行算术运算。

如果你真的想要你格式的数据。添加多播和聚合以及 SUM(Size),然后合并回您的原始流。

使用派生列和脚本组件

您可以按照以下步骤实现:

  1. 使用以下表达式添加派生列(名称:intValue):

    (DT_I4)(RIGHT([Value],2) == "GB" ? SUBSTRING([Value],1,FINDSTRING( [Value], " ", 1)) : "0")
    

    因此,如果值以 GB 结尾,则取数字,否则结果为 0

  2. 添加脚本组件后,在输入和输出属性中,单击输出并将SynchronousInput 属性设置为None

  3. 添加 2 个输出列 outKey , outValue

  1. 在脚本编辑器中编写以下脚本(VB.NET)

    Private SumValues As Integer = 0
    Public Overrides Sub PostExecute()
        MyBase.PostExecute()
    
        Output0Buffer.AddRow()
        Output0Buffer.outKey = ""
        Output0Buffer.outValue = SumValues.ToString & " GB"
    
    End Sub
    
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    
        Output0Buffer.AddRow()
        Output0Buffer.outKey = Row.Key
        Output0Buffer.outValue = Row.Value
        SumValues += Row.intValue
    
    End Sub
    

我能够使用触发器以另一种方式解决我的问题。

我使用了这个代码:

INSERT INTO [Table] (
[Filename]
, [Type]
, [DeviceSN]
, [Property]
, [Value]   
)
SELECT ms.[Filename],
ms.[Type],
ms.[DeviceSN],
'Memory Device.Total' AS [Key],
CAST(SUM(CAST(left(ms.[Value], 2) as INT)) AS VARCHAR) + ' GB' as 'Value'
FROM [Table] ms
JOIN inserted i ON i.Row# = ms.Row#
WHERE ms.[Value] like '%GB'
GROUP BY ms.[filename],
ms.[type],
ms.[devicesn]