使用虚拟键在子查询上加入在主查询上更改SUM?

时间:2015-01-05 20:00:14

标签: sql sql-server-2008 tsql join

我正在从多个来源汇总每日数据。原始查询如下:

SELECT
  D.MonthDate
  ,S.StoreName
  ,ISNULL(SUM(P.ProductSales),0) Sales
  ,ISNULL(SUM(A.AccessorySales),0) Accessories
FROM StoreDirectory S
JOIN DateDimension D
  ON DayDate >= '2014-01-01'
  AND DayDate <= '2014-12-31'
LEFT JOIN ProductData P
  ON P.StoreName = S.StoreName
  AND P.ActivityDate = D.DayDate
LEFT JOIN AccessoryData A
  ON A.StoreName = S.StoreName
  AND A.ActivityDate = D.DayDate
GROUP BY
  D.MonthDate
  ,S.StoreName

我们的想法是为一年中的每一天建立一个每个商店都有价值的表格。 (DateDimension表每天都有一行,其中包含其他方便的参考信息,例如MonthDate中月份的最后一天)然后,如果P和D中有活动信息,请将其连接到该行。然后,GROUP BY和SUM将这些数据汇总到月份。

这很有效。

我需要按因子缩放ProductSales,因此我构建了一个子查询,其中包含每个MonthDate的唯一行以及缩放因子。字面上只有两列,像这样(十二行,每个月结束日期一个):

MonthDate     Factor
---------     ------
2014-01-31    1.2
2014-02-28    0.8
etc...

MonthDate是一个虚拟主键 - 每个MonthDate只有一行。

我添加了一行来将此子查询加入到上表中,在SELECT语句中包含了Factor,并将其添加到了分组列列表中:

SELECT
  D.MonthDate
  ,S.StoreName
  ,F.Factor --Added this factor field
  ,ISNULL(SUM(P.ProductSales),0) Sales
  ,ISNULL(SUM(A.AccessorySales),0) Accessories
FROM StoreDirectory S
JOIN DateDimension D
  ON DayDate >= '2014-01-01'
  AND DayDate <= '2014-12-31'

--Updated to more closely resemble the actual sub-query
JOIN (
  SELECT
    FT.MonthDate
    ,SUM(FT.Factor)
  FROM FactorTable FT
  JOIN DateDimension D
    ON FT.DailyContribution = D.DayDate
  GROUP BY
    MonthDate) F
  ON F.MonthDate = D.MonthDate

LEFT JOIN ProductData P
  ON P.StoreName = S.StoreName
  AND P.ActivityDate = D.DayDate
LEFT JOIN AccessoryData A
  ON A.StoreName = S.StoreName
  AND A.ActivityDate = D.DayDate
GROUP BY
  D.MonthDate
  ,S.StoreName
  ,F.Factor --Added Factor to the GROUP BY

我认为这只会将适当的因子作为列添加到现有的SUM中。它不是。它改为计算比原始查询大得多的SUM。

  1. 为什么会这样?
  2. 如何修复并维护现有的聚合?
  3. 我需要因素(可选)调整另一个背景下的销售数字......

    非常感谢你的帮助 - 让我知道我是否可以澄清任何事情!

1 个答案:

答案 0 :(得分:0)

感谢帮助,伙计们!

发现了我的错误:

AccessoryData表每个DayDate有多行,这些行是从其余数据中复制的行。检查你的消息来源,伙计们!