[英]Adding a total row at the bottom in a SQL Server query
我在SQL Server 2008中創建了兩個表,如下所示:
CompletedRecordsFinal
:
IF OBJECT_Id('tempdb..#CompletedRecordsFinal') IS NOT NULL
DROP TABLE #CompletedRecordsFinal
SELECT
C1, C2, C3, COUNT(distinct Id) as TotalRecords
INTO
#CompletedRecordsFinal
FROM
#CompletedRecords
GROUP BY
C1, C2, C3
結果示例:
C1 C2 C3 TotalRecords
A B 1 50
A B 2 100
WaitRecordsFinal
:
IF OBJECT_Id('tempdb..#WaitRecordsFinal') IS NOT NULL
DROP TABLE #WaitRecordsFinal
SELECT
C1, C2, C3, COUNT(distinct Id) as TotalWaitRecords
INTO
#WaitRecordsFinal
FROM
#WaitRecords
GROUP BY
C1, C2, C3
結果示例:
C1 C2 C3 TotalWaitRecords
A B 1 20
A B 2 30
我將這些表與左外部聯接一起使用,例如:
SELECT
w.C1, C.C2, w.C3, TotalWaitRecords, TotalRecords
FROM
#WaitingRecordsFinal w
LEFT OUTER JOIN
#CompletedRecordsFinal c ON c.C1 = w.C1
AND c.C2 = w.C2
AND c.C3 = w.C3
我想要在底部添加一個總行,但我無法管理它。 我覺得自己很親近,但是到目前為止,沒有任何事情像我想要的那樣工作。 我需要類似的東西(不起作用):
SELECT
w.C1, C.C2, w.C3, TotalWaitRecords, TotalRecords
FROM
#WaitingRecordsFinal w
LEFT OUTER JOIN
#CompletedRecordsFinal c ON c.C1 = w.C1
AND c.C2 = w.C2
AND c.C3 = w.C3
UNION
SELECT
C1 = 'Total', C2 = 'Total', C3 = -1, TotalWaitRecords, TotalRecords
FROM
#WaitingRecordsFinal w
LEFT OUTER JOIN
#CompletedRecordsFinal c ON c.C1 = w.C1
AND c.C2 = w.C2
AND c.C3 = w.C3
我想要的示例輸出:
C1 C2 C3 TotalRecords TotalWaitRecords
A B 1 50 20
A B 2 100 30
Total Total -1 150 50
任何幫助,將不勝感激。
編輯:我的問題與指示為重復主題的問題有些不同。 主要問題是我有3列用於分組依據。 因此,當我group by C1, C2, C3, with rollup
進行group by C1, C2, C3, with rollup
時group by C1, C2, C3, with rollup
我看到:
.....
X B -1 300 500
X Total -1 300 500
.....
A B -1 56 47
A Total -1 56 47
Total Total -1 356 547
我只需要最底層的行,而不需要其他行。 因此,此解決方案無濟於事。 我如何擺脫除最底端的總數之外的其他總數?
您可以使用WITH ROLLUP,也可以使用GROUPING()標記總計。
Select CASE WHEN GROUPING(w.C1) = 1 THEN 'Total' ELSE w.c1
, CASE WHEN GROUPING(C.C2) = 1 THEN 'Total' ELSE c.c2
, CASE WHEN GROUPING(w.C3) = 1 THEN 'Total' ELSE w.c3
, SUM(TotalWaitRecords) AS TotalWaitRecords
, SUM(TotalRecords) AS TotalRecords
from #WaitingRecordsFinal w
left outer join #CompletedRecordsFinal c
on c.C1 = w.C1
and c.C2 = w.C2
and c.C3 = w.C3
GROUP BY
w.C1
, C.C2
, w.C3
with rollup
您可以嘗試使用UNION ALL
。 我嘗試使用CTE將您的2個查詢合並為一個。
WITH cte AS
(
SELECT wrf.C1,
wrf.C2,
wrf.C3,
crf.TotalRecords,
SUM(wrf.TotalWaitRecords) AS TotalWaitRecords
FROM (SELECT C1,
C2,
C3,
COUNT(DISTINCT Id) AS TotalWaitRecords
FROM #WaitRecords
GROUP BY C1,
C2,
C3
) wrf
OUTER APPLY (SELECT crf.C1,
crf.C2,
crf.C3,
SUM(TotalRecords) AS TotalRecords
FROM (SELECT C1,
C2,
C3,
COUNT(DISTINCT Id) AS TotalRecords
FROM #CompletedRecords
GROUP BY C1,
C2,
C3
) crf
WHERE crf.C1 = wrf.C1
AND crf.C2 = wrf.C2
AND crf.C3 = wrf.C3
GROUP BY crf.C1,
crf.C2,
crf.C3
) crf
GROUP BY wrf.C1,
wrf.C2,
wrf.C3,
crf.TotalRecords
)
SELECT *
FROM cte
UNION ALL
SELECT 'Total',
'Total',
-1,
SUM(TotalRecords) TotalRecords,
SUM(TotalWaitRecords) TotalWaitRecords
FROM cte
如果我只是使用已經創建的臨時表,則應該可以輕松完成此操作。
IF OBJECT_Id('tempdb..#AllRecordsFinal') IS NOT NULL
DROP TABLE #AllRecordsFinal
SELECT wrf.C1,wrf.C2,wrf.C3,crf.TotalRecords,wrf.TotalWaitRecords
INTO #AllRecordsFinal
FROM #WaitRecordsFinal wrf
OUTER APPLY (
SELECT TotalRecords
FROM #CompletedRecordsFinal cr
WHERE cr.C1 = wrf.C1 AND cr.C2 = wrf.C2 AND cr.C3 = wrf.C3) crf
SELECT * FROM #AllRecordsFinal
UNION ALL
SELECT 'Total','Total',-1,
SUM(TotalRecords),
SUM(TotalWaitRecords)
FROM #AllRecordsFinal
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.