按月对查询进行分组

时间:2013-11-12 19:50:51

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有以下查询:

select

(select Sum(Stores) from XYZ where Year = '2013' and Month = '8' )
-
(select Sum(SalesStores) from ABC where Year = '2013' and Month = '8') as difference

在上面的查询中,Year和Month也是表的列。

我想知道是否有办法运行相同的查询,以便它在一年中的每个月都运行?

5 个答案:

答案 0 :(得分:2)

;WITH Months(Month) AS
(
    SELECT 1 
    UNION ALL
    SELECT Month + 1
    FROM Months
    where Month < 12
)


SELECT '2013' [Year], m.Month, COALESCE(SUM(Stores), 0) - COALESCE(SUM(SalesStores), 0) [Difference]
FROM months m
LEFT JOIN XYZ x ON m.Month = x.Month
LEFT JOIN ABC a ON a.Month = m.Month

GROUP BY m.Month

答案 1 :(得分:2)

如果在XYZABC表中有数月/没有数据/行,那么我会使用FULL OUTER JOIN

SELECT ISNULL(x.[Month], y.[Month]) AS [Month],
       ISNULL(x.Sum_Stores, 0) - ISNULL(y.Sum_SalesStores, 0) AS Difference
FROM   
(
    SELECT [Month], Sum(Stores) AS Sum_Stores 
    FROM   XYZ 
    WHERE  [Year] = '2013' 
    GROUP BY [Month]
) AS x
FULL OUTER JOIN
(
    SELECT [Month], Sum(SalesStores) AS Sum_SalesStores 
    FROM   ABC 
    WHERE  [Year] = '2013' 
    GROUP BY [Month]
) AS y ON x.[Month] = y.[Month]

答案 2 :(得分:1)

您可以在内部交易中使用GROUP BY,然后运行联接,如下所示:

SELECT left.Month, (left.sum - COALESCE(right.sum, 0)) as difference
FROM (
    SELECT Month, SUM(Stores) as sum
    FROM XYZ WHERE Year = '2013'
    GROUP BY Month
) left
LEFT OUTER JOIN (
    SELECT Month, SUM(Stores) as sum
    FROM ABC WHERE Year = '2013'
    GROUP BY Month
) right ON left.Month = right.Months

请注意COALESCE的使用。如果SUM表中没有月份记录,则可以保留第一个ABC的值。

答案 3 :(得分:0)

在以下示例中,将UNION ALL运算符与CTE

一起使用
;WITH cte AS
 (SELECT SUM(Stores) AS Stores, [Month]
  FROM dbo.XYZ
  WHERE [Year] = '2013'
  GROUP BY [Month]      
  UNION ALL
  SELECT -1.00 * SUM(SalesStores), [Month]
  FROM dbo.ABC      
  WHERE [Year] = '2013'
  GROUP BY [Month]
  )
  SELECT [Month], SUM(Stores) AS Difference
  FROM cte  
  GROUP BY [Month]

SQLFiddle上的演示

答案 4 :(得分:0)

  ;WITH Months(Month) AS
    (
        SELECT 1 
        UNION ALL
        SELECT Month + 1
        FROM Months
        where Month < 12
    )

    SELECT Months. Month ,
(select isnull(Sum(Stores),0) from XYZ where Year = '2013' and Month = Months.Month) - (select isnull(Sum(SalesStores),0) from ABC where Year = '2013' and Month =Months.Month) as difference
    FROM Months