【发布时间】:2020-08-04 23:36:55
【问题描述】:
如何设置此左连接,使其不会重复我在 Table2 中的调用或在 Table3 中的销售?
左加入表 2 或表 3 返回准确的答案,左加入同一查询重复 - 虽然我有 3 个电话和 444 美元的销售额,但它返回 6 个电话(表 2 的三个记录 x 表 3 的两个记录) 和 1332 美元的销售额。
使用 SQL Server Studio 17。
CREATE TABLE #Table1 (
CommercialTime datetime,
NextCommercialTime datetime,
Station varchar(4),
Cost int )
INSERT INTO #Table1 (
CommercialTime,
NextCommercialTime,
Station,
Cost )
VALUES
( '2020-04-06 12:01:00.000',
'2020-04-06 12:15:00.000',
'ZZZZ',
'9999' )
CREATE TABLE #Table2 (
CallTime datetime,
Station varchar(4),
CallCount int )
INSERT INTO #Table2 (
CallTime,
Station,
CallCount )
VALUES
( '2020-04-06 12:02:00.000',
'ZZZZ',
'1' ),
( '2020-04-06 12:05:00.000',
'ZZZZ',
'1' ),
( '2020-04-06 12:07:00.000',
'ZZZZ',
'1' )
CREATE TABLE #Table3 (
SaleTime datetime,
Station varchar(4),
SaleAmount int )
INSERT INTO #Table3 (
SaleTime,
Station,
SaleAmount )
VALUES
( '2020-04-06 12:04:00.000',
'ZZZZ',
'123' ),
( '2020-04-06 12:07:00.000',
'ZZZZ',
'321' )
SELECT
one.Station
, SUM(two.Callcount) as Calls
, SUM(three.SaleAmount) as Sales
FROM #Table1 one WITH(NOLOCK)
LEFT JOIN #Table2 two WITH(NOLOCK) ON one.Station = two.Station
AND two.CallTime between one.CommercialTime and one.NextCommercialTime
LEFT JOIN #Table3 three WITH(NOLOCK) ON one.Station = three.Station
AND three.SaleTime between one.CommercialTime and one.NextCommercialTime
GROUP BY one.Station
--Output:
Station Calls Sales
ZZZZ 6 1332
【问题讨论】:
-
这是一个常见的错误,人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试完成所有连接然后全部聚合或聚合以前的聚合。在适当的行上写单独的总和和/或总结一个案例语句选择行;加入常见的唯一列集。 PS 在minimal reproducible example 中:找到第一个子表达式,它是您可以显示的代码执行您期望的扩展,而代码不符合您的期望。然后解释你的期望和原因。
-
这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。除非我们努力(重新重新)写清楚,否则我们无法推理、交流或搜索。
-
@DonnaC 以下任何一个答案对您有帮助吗?作为新人,你读过Accepting Answers吗?
标签: sql sql-server join left-join