2015-10-08 67 views
0

我有一些問題在SQL Server完成SQL語句2008選擇和group by - 計算領域

我「QUERY1」如下:

SELECT [Vc_MONTH], 
     [Vc_STATE], 
     [Vc_PRODUCT], 
     SUM ([TOTAL]) as Total_Units, 
     SUM ([OPEN]) as Open_Units 

FROM [test].[dbo].[Tbl_Summary] 

GROUP BY [Vc_MONTH], 
     [Vc_REGION], 
     [Vc_PRODUCT], 

此查詢選擇月,地區,產品,總單位數和開放單位總數。

我已經按月份,地區和產品分組。 (我有更多的線)

此查詢的工作原理。

我需要的是另一個'query2',它按(ALL)表分列在表中的月份進行分組,然後是這兩個選擇的聯合。

最後我需要的是這樣的

QUERY1

|MONTH | STATE | PRODUCT | TOTAL | OPEN | 
|:-----|:------|:--------|:------|:-----| 
|JAN | CA | PENCIL | 200 | 160 | 
|JAN | FL | BOOK | 300 | 280 | 
|FEB | CA | PENCIL | 180 | 150 | 
|FEB | FL | PENCIL | 250 | 100 | 
|MAR | CA | BOOK | 250 | 100 | 
|MAR | FL | BOOK | 100 | 50 | 

QUERY2 - 這就是我需要

|MONTH | STATE | PRODUCT | TOTAL | OPEN | 
|:-----|:------|:--------|:------|:-----| 
|JAN | CA | PENCIL | 200 | 160 | 
|JAN | FL | BOOK | 300 | 280 | 
|FEB | CA | PENCIL | 180 | 150 | 
|FEB | FL | PENCIL | 250 | 100 | 
|MAR | CA | BOOK | 250 | 100 | 
|MAR | FL | BOOK | 100 | 50 | 

UNION

|ALL | CA | PENCIL | 380 | 310 | 
|ALL | CA | BOOK | 250 | 100 | 
|ALL | FL | PENCIL | 250 | 100 | 
|ALL | FL | BOOK | 400 | 330 | 

在此先感謝, 路易斯

+0

抱歉,您的問題不是很清楚。爲什麼CA行被加入到'ALL'中但FL不是?兩個'select'將被加入?也許更大的樣本數據將有助於 –

+0

「CA」和「FL」的區別? –

+0

已編輯樣本數據。 –

回答

0

所以你已經有查詢1:

SELECT [Vc_MONTH], 
    [Vc_STATE], 
    [Vc_PRODUCT], 
    SUM ([TOTAL]) as Total_Units, 
    SUM ([OPEN]) as Open_Units 
FROM [test].[dbo].[Tbl_Summary] 
GROUP BY [Vc_MONTH], 
    [Vc_STATE], 
    [Vc_PRODUCT] 

接下來,您需要GROUP按月和產品是否正確?但是,您需要在'Vc_STATE'列中指定一個值,以便兩個查詢的結果集返回相同的列。

UNION 
SELECT [Vc_MONTH], 
    'ALL STATES', 
    [Vc_PRODUCT], 
    SUM ([TOTAL]) as Total_Units, 
    SUM ([OPEN]) as Open_Units 
FROM [test].[dbo].[Tbl_Summary] 
GROUP BY [Vc_MONTH], 
    [Vc_PRODUCT] 
+0

完美的作品!這個邏輯適用於我需要的所有選擇。謝謝Wil! –

+2

UNION在上面的答案應該是一個聯盟所有(如果不是那麼你做什麼是不同的結果表1和2,而不是表1 +表2 –

+0

嘗試GROUP BY GROUPING SETS然後沒有聯盟是必需的 –

0

不是SQL Server大師任何延伸,但我認爲它有一個with條款:

with monthly as (
    SELECT 
    [Vc_MONTH], [Vc_STATE], [Vc_PRODUCT], 
    SUM ([TOTAL]) as Total_Units, 
    SUM ([OPEN]) as Open_Units 
    FROM [test].[dbo].[Tbl_Summary] 
    GROUP BY 
    [Vc_MONTH], [Vc_STATE], [Vc_PRODUCT] 
) 
select 
    [Vc_MONTH], [Vc_STATE], [Vc_PRODUCT], 
    Total_Units, Open_Units 
from monthly 
union all 
select 
    '*ALL', [Vc_STATE], [Vc_PRODUCT], 
    sum (Total_Units), sum (Open_Units) 
from monthly 
group by [Vc_STATE], [Vc_PRODUCT] 
1

我想你應該只使用grouping sets。更簡單的查詢和否union

SELECT (CASE WHEN GROUPING([Vc_MONTH]) = 1 THEN 'ALL' ELSE [Vc_MONTH] END) as [Vc_MONTH], 
     [Vc_STATE], [Vc_PRODUCT], 
     SUM ([TOTAL]) as Total_Units, 
     SUM ([OPEN]) as Open_Units 
FROM [test].[dbo].[Tbl_Summary] 
GROUP BY GROUPING SETS (([Vc_MONTH], [Vc_REGION], [Vc_PRODUCT]), 
         ([Vc_REGION], [Vc_PRODUCT]) 
         );