Microsoft Sql 服务器使用 Pivot 的多个聚合函数
Microsoft Sql Server multiple aggreate functions using Pivot
我有这样的数据
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
任何人都可以帮助我获得我正在寻找的正确格式吗?
尝试使用 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
输出:
payor S1 S2 S3
-------------------------------
Medical 2 2 1
Medical 300 850 500
在以下情况下使用简单的 CASE:
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
输出:
Payor S1 S2 S3 S1_Cnt S2_Cnt S3_Cnt
-----------------------------------------------------------
Medical 300 850 500 2 2 1
我有这样的数据
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
任何人都可以帮助我获得我正在寻找的正确格式吗?
尝试使用 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
输出:
payor S1 S2 S3
-------------------------------
Medical 2 2 1
Medical 300 850 500
在以下情况下使用简单的 CASE:
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
输出:
Payor S1 S2 S3 S1_Cnt S2_Cnt S3_Cnt
-----------------------------------------------------------
Medical 300 850 500 2 2 1