【问题标题】:SSIS - Merging rows with aggregate determinationsSSIS - 将行与聚合确定合并
【发布时间】:2015-09-30 18:05:40
【问题描述】:

我正在尝试确定在 SSIS 或直接 TSQL 中基于给定键合并两行的最佳方法,但根据各种聚合规则(特别是 MAX 和 SUM)从每一行获取特定数据。例如,给定以下数据集:

Customer    Name    Total   Date        Outstanding
12345       A       100     7/15/2015   500
12345               200     1/1/2015    300
456         B       500     1/2/2010    100
456         B       250     2/1/2015    900
78          C       100     9/15/2015   500

我希望将这些合并到每个客户键的一行中,以以下规则为例:

  • 如果任何名称为空,请为该客户使用不为空的对应值
  • MAX(总计)
  • MAX(日期)
  • 总和(优秀)

结果集将是:

Customer    Name    Total   Date        Outstanding
12345       A       200     7/15/2015   800
456         B       500     2/1/2015    1000
78          C       100     9/15/2015   500

这里最好的方法是什么?我的第一直觉是查询表以在客户上连接到自身以获取单行上的所有值,然后在 SSIS 的派生列任务中使用公式来确定要使用的值。我担心这是不可扩展的——如果我有一个客户在主数据集中只出现两次,它就可以正常工作,但目标是让逻辑适用于 N 行,而无需进行大量返工。我确定这里还缺少一种 TSQL 方法。任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    如果您的查询中的名称列不为空,那么您只需在一个查询中使用聚合函数即可做到这一点

        DECLARE @Customer TABLE
    (
    Customer INT,   Name varchar(10),   Total INT   , PurchaseDate DATE  ,      Outstanding  INT
    )
    INSERT INTO @Customer
    SELECT 12345,'A',100,'7/15/2015',500 UNION
    SELECT 12345,'A',200,'1/1/2015',300 UNION
    SELECT 456,'B',500,'1/2/2010',100 UNION
    SELECT 456,'B',250,'2/1/2015',900 UNION
    SELECT 78,'C',100,'9/15/2015',500
    
    
    SELECT Customer,NAME ,MAX(Total), MAX(PurchaseDate), SUM(outstanding)
    FROM @Customer 
    GROUP BY Customer, NAME
    

    Demo

    现在,如果您在示例中提到的少数情况下您的名称列是空的,那么您可以使用正确的名称值更新名称表

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      相关资源
      最近更新 更多