Sql server 计算总和并作为行插入

Sql server 计算总和并作为行插入,sql-server,ssis,etl,Sql Server,Ssis,Etl,使用SSI,我将在输出中引入包含以下内容的原始文本文件: 我稍后会使用这些数据来报告。关键列将被旋转。但是,我不想单独显示所有这些列,我只想显示总数。 为了实现这一点,我的想法是使用触发器计算插入时的总和,然后将总和作为新行插入数据 输出将类似于: 我想做的事可能吗?是否有更好的方法在pivot上动态执行此操作?要明确的是,我不只是为报表旋转这些行,还有其他行不需要计算总和 我将向您展示一种方法,但我不建议将总计添加到详细数据的末尾。如果你要报告它,就把它作为一个总数显示出来 在源添加数据转

使用SSI,我将在输出中引入包含以下内容的原始文本文件:

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

输出将类似于:


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

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

在源添加数据转换后:

C#

  • 向数据流中添加两列:Size int和type string

  • 选择值为只读

  • 代码如下:

    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";
    }
    
    现在,您的表中有了具有适当数据类型的数据来执行算术运算

    如果你真的想要你的格式的数据。添加多播、聚合和总和(大小),然后合并回原始流。

    使用派生列和脚本组件 您可以通过以下步骤实现这一点:

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

    (DT_I4)(RIGHT([Value],2) == "GB" ? SUBSTRING([Value],1,FINDSTRING( [Value], " ", 1)) : "0")
    
    因此,如果值以
    GB
    结尾,则取数字,否则结果为
    0

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

  • 添加两个输出列
    outKey
    outValue
  • 在脚本编辑器中编写以下脚本(VB.NET)


  • 我可以用另一种方法解决我的问题

    我使用了以下代码:

    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]
    

    我认为使用脚本组件比添加多播、聚合和合并更容易更快地实现这一点,请查看我的答案。我再次使用VB.NET:)我需要在报告中这样做,因为列是动态旋转的,这使得我很难进行计算。我甚至不推荐摘要,而是在报告中包含详细信息,然后在报告中进行汇总。什么意思包含详细信息?你不推荐摘要是什么意思?你能举个例子吗?我有3列存储在db中。每行的设备名称、大小和类型。然后,我会创建一个显示该信息的报告,然后在末尾加上一个总和size.Hi。为什么你认为这与正常化有关?还有,你能做什么?PS谢谢。仅为方便补充文本和/或为文本中无法给出的内容使用图像。另请参见。您是正确的。规范化不应该是这里的标记。我列出了我目前能够做的事情和需要做的事情。我没有看到任何问题,我张贴一个图像在这里提供一个例子。
    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]