如何设置此左联接,以使其不重复表2中的呼叫或表3中的销售?
左联接到Table2或Table3会返回准确的答案,左联接会在相同的查询重复项中同时返回-我有3个调用且销售额为$ 444,它返回6个调用(Table2的三个记录x Table3的两个记录),销售额为$ 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
答案 0 :(得分:1)
您可以使用outer apply
:
SELECT one.Station, ISNULL(t2.calls, 0) AS Calls, ISNULL(t3.sales, 0) AS Sales
FROM #Table1 one WITH(NOLOCK) OUTER APPLY
( SELECT SUM(two.Callcount) as calls
FROM #Table2 two
WHERE one.Station = two.Station AND
two.CallTime between one.CommercialTime and one.NextCommercialTime
) t2 OUTER APPLY
( SELECT SUM(three.SaleAmount) as sales
FROM #Table3 three
WHERE one.Station = three.Station AND
three.SaleTime between one.CommercialTime and one.NextCommercialTime
) t3;
答案 1 :(得分:0)
对于这个问题,我建议使用子查询而不是例如加入
SELECT
one.Station
, (
select sum(CallCount)
from #Table2 two
where one.Station = two.Station
AND two.CallTime between one.CommercialTime and one.NextCommercialTime
) Calls
, (
select sum(SaleAmount)
from #Table3 three
where one.Station = three.Station
AND three.SaleTime between one.CommercialTime and one.NextCommercialTime
) Sales
FROM #Table1 one
原因是联接为您提供了行的所有组合,而这并不是您想要的。解释一下,当您将Table2连接到Table1上时,将获得3行:
Station TwoCallTime
ZZZZ 2020-04-06 12:02:00.000
ZZZZ 2020-04-06 12:05:00.000
ZZZZ 2020-04-06 12:07:00.000
因此,当您加入具有2行的Table3时,现在有6行:
Station TwoCallTime ThreeCallTime
ZZZZ 2020-04-06 12:02:00.000 2020-04-06 12:04:00.000
ZZZZ 2020-04-06 12:02:00.000 2020-04-06 12:07:00.000
ZZZZ 2020-04-06 12:05:00.000 2020-04-06 12:04:00.000
ZZZZ 2020-04-06 12:05:00.000 2020-04-06 12:07:00.000
ZZZZ 2020-04-06 12:07:00.000 2020-04-06 12:04:00.000
ZZZZ 2020-04-06 12:07:00.000 2020-04-06 12:07:00.000
这不是您要在此处完成的工作。