2015-10-08 15 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]) 
         );