计算总和并作为行插入
Calculate Sum and Insert as Row
我使用 SSIS 引入了在输出中包含此内容的原始文本文件:
我稍后会使用此数据进行报告。关键列得到旋转。但是,我不想单独显示所有这些列,我只想显示总数。
为此,我的想法是使用触发器计算插入时的总和,然后将总和作为新行插入到数据中。
输出类似于:
我想做的事情可行吗?有没有更好的方法在 pivot 上动态地执行此操作?需要明确的是,我不只是为报告旋转这些行,还有其他不需要计算总和的行。
我将向您展示一种方法,但我不建议将总计添加到详细数据的末尾。如果您要报告它,请将其显示为总数。
源后添加数据转换:
C#
向您的数据流添加两列:大小为 int,类型为字符串
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),然后合并回您的原始流。
使用派生列和脚本组件
您可以按照以下步骤实现:
使用以下表达式添加派生列(名称:intValue
):
(DT_I4)(RIGHT([Value],2) == "GB" ? SUBSTRING([Value],1,FINDSTRING( [Value], " ", 1)) : "0")
因此,如果值以 GB
结尾,则取数字,否则结果为 0
。
添加脚本组件后,在输入和输出属性中,单击输出并将SynchronousInput
属性设置为None
- 添加 2 个输出列
outKey
, outValue
在脚本编辑器中编写以下脚本(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]
我使用 SSIS 引入了在输出中包含此内容的原始文本文件:
我稍后会使用此数据进行报告。关键列得到旋转。但是,我不想单独显示所有这些列,我只想显示总数。 为此,我的想法是使用触发器计算插入时的总和,然后将总和作为新行插入到数据中。
输出类似于:
我想做的事情可行吗?有没有更好的方法在 pivot 上动态地执行此操作?需要明确的是,我不只是为报告旋转这些行,还有其他不需要计算总和的行。
我将向您展示一种方法,但我不建议将总计添加到详细数据的末尾。如果您要报告它,请将其显示为总数。
源后添加数据转换:
C#
向您的数据流添加两列:大小为 int,类型为字符串
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),然后合并回您的原始流。
使用派生列和脚本组件
您可以按照以下步骤实现:
使用以下表达式添加派生列(名称:
intValue
):(DT_I4)(RIGHT([Value],2) == "GB" ? SUBSTRING([Value],1,FINDSTRING( [Value], " ", 1)) : "0")
因此,如果值以
GB
结尾,则取数字,否则结果为0
。添加脚本组件后,在输入和输出属性中,单击输出并将
SynchronousInput
属性设置为None
- 添加 2 个输出列
outKey
,outValue
在脚本编辑器中编写以下脚本(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]