2017-05-30 92 views
0

我试图将UNIONCOUNT查询的结果加在一起以轻松获得“总计”。我的SQL查询是一个简单的UNION,任何人都可以建议如何添加生成的结果给我一个总数?多个COUNT(UNION)SQL查询的SUM结果

SELECT 'BOXES' AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
FROM dbo.VIEW_GLOBAL_SEARCH 
WHERE RECORD_TABLE = 'TB_BOXES' 
GROUP BY RECORD_TABLE 
UNION 
SELECT 'MAPS' AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
FROM dbo.VIEW_GLOBAL_SEARCH 
WHERE RECORD_TABLE = 'MAPS' 
GROUP BY RECORD_TABLE 

我的结果看起来像下面,我想添加一个'总数'列与记录总数。

DATASET  RECORDS_IN_ARCHIVE 
TB_BOXES  3149 
TB_MAPS  856 
+0

包裹从该联盟的CTE和选择总? – Jan

回答

0
WITH CTE AS (
SELECT Record_Table, COUNT(Record_Table) Records_In_Archive 
FROM dbo.VIEW_GLOBAL_Search 
WHERE Record_Table IN ('Maps','TB_Boxes') 
GROUP BY Record_Table 
ORDER BY Record_Table 
) 
SELECT ISNULL(Case Record_Table WHEN 'TB_Boxes' THEN 'Boxes' ELSE Record_Table 
END,'Total') Record_Table, 
SUM(Records_In_Archive) Records_In_Archive 
FROM CTE 
GROUP BY Case Record_Table WHEN 'TB_Boxes' THEN 'Boxes' ELSE Record_Table END 
WITH ROLLUP 
ORDER BY Record_Table 

尽管如此,如果你正在寻找一个单独的结果:

SELECT 'Total', COUNT(Record_Table) 
FROM dbo.VIEW_Global_Search 
WHERE Record_Table IN ('TB_Boxes','Maps') 

为什么overthink这个?

+0

工会是可怕的 - 表现明智。利用SQL来过滤初始数据集以获取所需的值,并在过滤后的集合上执行所需的聚合以解决所需的逻辑。 Group by具有WITH ROLLUP和WITH CUBE ...用于在1个查询中对总计进行求和。 – Alocyte

+0

感谢Alocyte的信息 - 我将着眼于将来使用ROLLUP和WITH CUBE在单个查询中对总计进行求和,因为这基本上是我所追求的。再次感谢。 – b0redj0rd

0

使用公共表表达式为您UNION应招:

WITH rawdata AS (
    SELECT 'BOXES' AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
    FROM dbo.VIEW_GLOBAL_SEARCH 
    WHERE RECORD_TABLE = 'TB_BOXES' 
    GROUP BY RECORD_TABLE 
UNION 
    SELECT 'MAPS' AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
    FROM dbo.VIEW_GLOBAL_SEARCH 
    WHERE RECORD_TABLE = 'MAPS' 
    GROUP BY RECORD_TABLE 
) SELECT SUM(RECORDS_IN_ARCHIVE) FROM rawdata; 
+0

谢谢你,那个工作,并给了我总共的记录数。感谢您花时间看看。 – b0redj0rd

+0

随时接受最好的答案 – Jan

0

你的意思是总共添加新行?

SELECT RECORD_TABLE AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
FROM dbo.VIEW_GLOBAL_SEARCH 
WHERE RECORD_TABLE IN ('TB_BOXES', 'MAPS') 
GROUP BY RECORD_TABLE 
UNION ALL 
SELECT 'TOTAL' AS DATASET, 
     COUNT(RECORD_TABLE) AS RECORDS_IN_ARCHIVE 
FROM dbo.VIEW_GLOBAL_SEARCH 
WHERE RECORD_TABLE IN ('TB_BOXES', 'MAPS');