使用虚拟键更改子查询上的 JOIN 更改主查询上的 SUM?

JOIN on Sub-query with Virtual Keys Changes SUM on Main Query?

我正在将多个来源的每日数据汇总到每月。原始查询是这样的:

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

我们的想法是构建一个 table,其中包含一年中每一天的每家商店的价值。 (DateDimension table 每天都有一行,还有其他方便的参考信息,例如 MonthDate 中的月份的最后一天)然后,如果 P 和 D 中有 activity 信息,则将其加入该行.然后,GROUP BY 和 SUM 将这些数据聚合到月份。

这有效。

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

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

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

我在上面的 table 中添加了一行 JOIN 这个子查询,在 SELECT 语句中包含了因子,并将其添加到分组列列表中:

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. 如何修复它并维护现有聚合?

我需要因素来(可选)在另一个上下文中调整销售数字...

非常感谢您的帮助 - 如果我能澄清任何问题,请告诉我!

感谢大家的帮助!

发现我的错误:

AccessoryData table 每个 DayDate 有多个行,这些行与其余数据重复。伙计们,请检查您的消息来源!