簡體   English   中英

SQL Server Pivot以百分比而非值的形式顯示,並添加總行和列

[英]SQL Server Pivot as percentage rather than values and add a total row and column

我有代碼,這給了我一個小小的樞紐:

SELECT [U C], [M] AS EE, [F] AS LL
FROM   
(SELECT [U N], f_k, [U C]  
FROM [MH2] 
WHERE [U C] IN ('I', 'E', 'T')) p  
PIVOT (COUNT ([U N]) 
 FOR f_k IN ([M], [F])) AS pvt  
ORDER BY pvt.[U C]

輸出:

U C     EE      LL
E       509762  412358
I       16440   1138538
T       197     8753

但是我希望這是一個這樣的百分比,並具有總計的行和列:

U C   EE        LL      Total
E     24.44%    19.77%  44.20%
I     0.79%     54.58%  55.37%
T     0.01%     0.42%   0.43%
Total 25.23%    74.77%  100.00%

編輯使用@ Gordon Linoff的Answer的變體解決。

SELECT COALESCE([U C], 'Total') [U C],
SUM(CASE WHEN f_k = 'F' THEN 1 ELSE 0 END) * 100.0 / cnt LL,
SUM(CASE WHEN f_k = 'M' THEN 1 ELSE 0 END) * 100.0 / cnt EE,
COUNT(*) * 100.0 / cnt Total
FROM (SELECT mh2.*, count(*) over () cnt
FROM mh2
WHERE [U C] IN ('I', 'E', 'T') 
AND f_k IN ('F', 'M')) mh2
GROUP BY GROUPING SETS (([U C], cnt))
UNION ALL
SELECT 'Total', SUM(a.LL), SUM(a.EE), ROUND(SUM(a.Total),2)
FROM(
SELECT COALESCE([U C], 'Total') [U C],
SUM(CASE WHEN f_k = 'F' THEN 1 ELSE 0 END) * 100.0 / cnt LL,
SUM(CASE WHEN f_k = 'M' THEN 1 ELSE 0 END) * 100.0 / cnt EE,
COUNT(*) * 100.0 / cnt Total
FROM (SELECT mh2.*, count(*) over () cnt
FROM mh2  
WHERE [U C] IN ('I', 'E', 'T') 
AND f_k IN ('F', 'M')) mh2
GROUP BY GROUPING SETS (([U C], cnt))) a

我發現條件聚合要簡單得多:

select coalesce([U C], 'total') as [U C],
       sum( case when fk = 'F' then 1 else 0 end) * 100.0 / cnt as EE,
       sum( case when fk = 'M' then 1 else 0 end) * 100.0 / cnt as LL,
       count(*) * 100.0 / cnt as total
from (select mh2.*, count(*) over () as cnt
      from mh2 
      where [U C] in ('I', 'E', 'T') and
            fk in ('F', 'M')
     ) mh2
group by grouping sets ( ([U C], cnt), (cnt) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM