如何将两个查询与不同的聚合值合并

时间:2018-04-02 22:02:13

标签: sql sql-server

我正在尝试合并两个查询,每个查询共有3个列,我们将其称为Market,Family,Month。

第一个代码告诉我按市场,家庭,月份的总销售额:

SELECT [Market]
      ,[Family]
      , DATEADD(month, DATEDIFF(month, 0, [ActualDate]), 0) AS [StartOfMonth] 
      , COUNT(*) AS [Sales]
      FROM [dbo].[SalesHistory]
      GROUP BY [Market], [Family], DATEADD(month, DATEDIFF(month, 0, [ActualDate]), 0)

第二组有4个不同的栏目:

SELECT  [Market]
      ,[Family] 
      ,DATEADD(month, DATEDIFF(month, 0, [Month]), 0) AS [StartOfMonth] 
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 10'
         THEN CAST([Volume] AS INT) END),0) AS [2017 10]
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 11'
         THEN CAST([Volume] AS INT) END),0) AS [2017 11]
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 12'
         THEN CAST([Volume] AS INT) END),0) AS [2017 12]
      ,ISNULL(SUM(CASE WHEN [Version] = 'Budget'
         THEN CAST([Volume] AS INT) END),0) AS [Budget]
      FROM [Harley-Davidson].[dbo].[ForecastData]
      GROUP BY [Market], [Family],DATEADD(month, DATEDIFF(month, 0, [Month]), 0)

我希望它们位于一个包含所有可能的Market,Family,StartOfMonth组合的表中,以及5列,其中相应的值显示零为null。

非常感谢任何和所有帮助!

1 个答案:

答案 0 :(得分:1)

如果这不是你想要的,请给我们一个更好的解释

SELECT ISNULL(m1.Market,m2.Market) 'MARKET'
        ,ISNULL(m1.Family,m2.Family) 'Family'
        ,ISNULL(m1.StartOfMonth,m2.StartOfMonth) 'StartOfMonth'
        ,m1.Sales
        ,m2.[2017 10]
        ,m2.[2017 11]
        ,m2.[2017 12]
        ,m2.Budget
From (
SELECT [Market]
      ,[Family]
      , DATEADD(month, DATEDIFF(month, 0, [ActualDate]), 0) AS [StartOfMonth] 
      , COUNT(*) AS [Sales]
      FROM [dbo].[SalesHistory]
      GROUP BY [Market], [Family], DATEADD(month, DATEDIFF(month, 0, [ActualDate]), 0)
    ) m1
FULL OUTER JOIN
(
SELECT  [Market]
      ,[Family] 
      ,DATEADD(month, DATEDIFF(month, 0, [Month]), 0) AS [StartOfMonth] 
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 10'
         THEN CAST([Volume] AS INT) END),0) AS [2017 10]
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 11'
         THEN CAST([Volume] AS INT) END),0) AS [2017 11]
      ,ISNULL(SUM(CASE WHEN [Version] = 'SOP 17 12'
         THEN CAST([Volume] AS INT) END),0) AS [2017 12]
      ,ISNULL(SUM(CASE WHEN [Version] = 'Budget'
         THEN CAST([Volume] AS INT) END),0) AS [Budget]
      FROM [Harley-Davidson].[dbo].[ForecastData]
      GROUP BY [Market], [Family],DATEADD(month, DATEDIFF(month, 0, [Month]), 0)
    ) m2
on m1.market = m2.market
and m1.family = m2.family
and m1.StartOfMonth = m2.StartOfMonth