2015-09-30 82 views
2

我试图确定最好的方法,无论是在SSIS或直TSQL,基于给定的键合并两行,但从各行基于各种聚合规则( MAX和SUM)。作为一个例子,给出下面的数据集:SSIS-合并行与聚合确定

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

如果您的查询的名字列不为空,那么你可以在一个查询做到这一点只需通过使用聚合函数

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

现在,如果你的名字列在少数情况下,像空你已经在你的例子中提到过,那么你可以更新名称表的正确名称值