2016-03-23 2 views
0

У меня есть две таблицы в SQL Server 2008 создается следующим:Добавление общей строки в нижней части в запросе SQL Server

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 

Любая помощь будет оценена.

EDIT: Моя проблема немного отличается от той, которая указана как дублирующий предмет. Основная проблема: у меня есть 3 столбца для группы. Поэтому, когда я 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 

Я просто нужен самый нижний ряд, а не в других. Поэтому это решение не помогает. Как я могу избавиться от других, кроме самого нижнего Total Total one?

+0

Add после того, как группу С1, С2, С3 С ROLLUP – mxix

+0

TotalWaitRecords Column/TotalRecords недопустим в списке выбора, поскольку он не содержится ни агрегатной функции или предложения GROUP BY. –

+1

Возможный дубликат [Добавить итоговую строку с итогами] (http://stackoverflow.com/questions/17934318/add-a-summary-row-with-totals) –

ответ

1

вы можете попробовать сделать это с помощью UNION ALL. Я попытался с помощью КТР, чтобы объединить 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 Fiddle Demo

Если я просто использовать таблицы Temp вы создаете уже, вы должны быть в состоянии просто сделать это.

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 
+0

Мой друг, хороший ответ, он работает! Однако можно ли найти более читаемый/более короткий путь? –

+0

@ Eray вы можете попробовать второй вариант – JamieD77

+0

Спасибо большое! .. –

2

Вы можете использовать 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 
+0

Очень близко, фактически давая общий результат, который я хочу, но давая некоторые дополнительные строки, отредактировал мой вопрос, пожалуйста, см. .. –