使用虚拟键更改子查询上的 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。
- 为什么会这样?
- 如何修复它并维护现有聚合?
我需要因素来(可选)在另一个上下文中调整销售数字...
非常感谢您的帮助 - 如果我能澄清任何问题,请告诉我!
感谢大家的帮助!
发现我的错误:
AccessoryData
table 每个 DayDate
有多个行,这些行与其余数据重复。伙计们,请检查您的消息来源!
我正在将多个来源的每日数据汇总到每月。原始查询是这样的:
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。
- 为什么会这样?
- 如何修复它并维护现有聚合?
我需要因素来(可选)在另一个上下文中调整销售数字...
非常感谢您的帮助 - 如果我能澄清任何问题,请告诉我!
感谢大家的帮助!
发现我的错误:
AccessoryData
table 每个 DayDate
有多个行,这些行与其余数据重复。伙计们,请检查您的消息来源!