SSIS - 使用聚合确定合并行

时间:2015-09-30 18:05:40

标签: sql-server ssis

我正在尝试确定在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

我希望将每个客户密钥合并为一行,并以下列规则为例:

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

结果集将是:

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方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果查询中的name列不为空,那么只需在一个查询中使用聚合函数

即可
    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

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