簡體   English   中英

在SQL Server查詢的底部添加總計行

[英]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 rollupgroup 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

SQL小提琴演示

如果我只是使用已經創建的臨時表,則應該可以輕松完成此操作。

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.

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