2016-09-25 47 views
1

Microsoft SQL Server的多个aggreate功能,我有这样的使用透视

select * from age; 

Payor Description ID Amount 
--------------------------------- 
Medical S1  101 200 
Medical s1  102 100 
Medical S2  201 400 
Medical S2  202 450 
Medical S3  301 500 

我需要在以下格式的数据的数据,第3列给出了总金额和最后3列给出的Id

的重复计数
Payor S1 S2 S3 S1_Count S2_Cnt S3_cnt 
------------------------------------------- 
Medical 300 850 500 2  2  1 

或者我在不同的多行显示相同的数据也好

Payor s1 s2 s3 
-------------------- 
Medical 300 850 500 
Medical 2 2 1 

一个聚合函数给出了金额的总和,另一个聚合函数给出了不同数量的id

我试过使用Pivot,但我无法弄清楚如何在单个SQL命令中使用两个聚合函数。当我使用count(distinct ID)时,它立即抛出一个错误,不知道我在做什么错误。

使用下面的代码,我可以得到第一个3列s1,s2,s3,它们是特定付款人的金额总和。

SELECT 
    [payor], [s1], [s2], [s3]    
FROM 
    (SELECT 
     [payor], des, amount 
    FROM age) AS age1 ---- from age table 
PIVOT 
    (SUM(amount) FOR des IN ([s1], [s2], [s3]) AS t2; --- sum  

任何人都可以帮助我找到正确的格式吗?

回答

0

尝试用UNION:

Select payor, S1, S2, S3 
FROM 
(
Select payor, Description, count(ID) CountVal, 1 AS Orderby from table 
group by payor, Description) z 
PIVOT 
(
MAX(CountVal) FOR Description IN ([S1], [S2], [S3]) 
) x 

UNION 

Select payor, S1, S2, S3 
FROM 
(
Select payor, Description, SUM(Amount) SumVal, 0 AS Orderby from table 
group by payor, Description) z 
PIVOT 
(
MAX(SumVal) FOR Description IN ([S1], [S2], [S3]) 
) x 

OUTPUT:

payor  S1  S2  S3 
------------------------------- 
Medical  2  2  1 
Medical  300  850  500 

使用简单CASE WHEN:

SELECT 
Payor, 
S1 = SUM (case when Description = 'S1' THEN Amount ELSE 0 END), 
S2 = SUM (case when Description = 'S2' THEN Amount ELSE 0 END), 
S3 = SUM (case when Description = 'S3' THEN Amount ELSE 0 END), 
S1_Cnt = COUNT (case when Description = 'S1' THEN ID ELSE NULL END), 
S2_Cnt = COUNT (case when Description = 'S2' THEN ID ELSE NULL END), 
S3_Cnt = COUNT (case when Description = 'S3' THEN ID ELSE NULL END) 
FROM table 
GROUP BY Payor 

OUTPUT:

Payor S1  S2  S3 S1_Cnt  S2_Cnt  S3_Cnt 
----------------------------------------------------------- 
Medical 300  850  500 2   2   1 
+0

钍非常感谢您,先生,我试过使用枢轴联合它使我的执行时间增加了一倍,但case语句对我来说效果很好。 – Avi