Sql server 从涉及两个其他日期之间的日期的查询中删除子查询
我有两张桌子第一张是这样叫这张桌子 另一个表是这样的调用这个表DataAndCreatedOn 现在我有一个这样的问题Sql server 从涉及两个其他日期之间的日期的查询中删除子查询,sql-server,tsql,Sql Server,Tsql,我有两张桌子第一张是这样叫这张桌子 另一个表是这样的调用这个表DataAndCreatedOn 现在我有一个这样的问题 Select sed.someotherdata , (select sum(data) from DataAndCreatedOn where CreatedOn between sed.StartDate and sed.EndDate) as total from StartEndDates sed 有没有办法摆脱子查询sele
Select sed.someotherdata
, (select sum(data)
from DataAndCreatedOn
where CreatedOn between sed.StartDate and sed.EndDate) as total
from StartEndDates sed
有没有办法摆脱子查询select sumdata from DATA和CreatedOn,其中CreatedOn介于sed.StartDate和sed.EndDate之间,作为总计并以某种方式将其作为联接?您可以通过以下方式使用联接和组:
但是,StartEndDates的行将被分组。如果您在其他数据上有重复的值,则与原始查询相比,您可能会得到较少的行。如果您确实想删除该子查询,也可以使用交叉应用,尽管执行计划几乎相同。正如@EzLo所指出的,正如您将从我的示例中看到的,如果您有重复的其他数据,它将根据您是否执行左连接或交叉应用来更改您的结果。因此,这取决于您希望从查询中得到什么。我还要注意查询性能:
CREATE TABLE #StartEndDates(StartDate date, EndDate date, SomeOtherData varchar(100))
CREATE TABLE #DateAndCreatedOn(Data decimal(10,4), CreatedOn date)
INSERT INTO #StartEndDates VALUES('2018-09-08', '2018-09-23', 'data 1')
INSERT INTO #StartEndDates VALUES('2018-07-08', '2018-08-01', 'data 2')
INSERT INTO #StartEndDates VALUES('2018-07-21', '2018-08-12', 'data 3')
--INSERT THIS ROW TO SEE DUPLICATE SomeOtherData
INSERT INTO #StartEndDates VALUES('2018-07-11', '2018-08-12', 'data 3')
INSERT INTO #DateAndCreatedOn VALUES(1.5,'2018-09-20')
INSERT INTO #DateAndCreatedOn VALUES(2.4,'2018-07-15')
INSERT INTO #DateAndCreatedOn VALUES(3.5,'2018-07-21')
--ORIGINAL QUERY
Select sed.someotherdata
, (select sum(data)
from #DateAndCreatedOn
where CreatedOn between sed.StartDate and sed.EndDate) as total
from #StartEndDates sed
--LEFT JOIN QUERY
SELECT
sed.someotherdata,
SUM(d.data) as total
FROM
#StartEndDates sed
LEFT JOIN #DateAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
sed.someotherdata
--CROSS APPLY QUERY
SELECT sed.SomeOtherData, x.SM
FROM #StartEndDates sed
CROSS APPLY (SELECT SUM(Data) SM from #DateAndCreatedOn d where d.CreatedOn between sed.StartDate and sed.EndDate) x
Ezlo提供了答案和警告。仔细考虑一下这个警告。当前查询返回StartEndDates中的每一行,即使有多行包含someotherdata的相同值。
Select sed.someotherdata
, (select sum(data)
from DataAndCreatedOn
where CreatedOn between sed.StartDate and sed.EndDate) as total
from StartEndDates sed
SELECT
sed.someotherdata,
SUM(d.data) as total
FROM
StartEndDates sed
LEFT JOIN DataAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
sed.someotherdata
CREATE TABLE #StartEndDates(StartDate date, EndDate date, SomeOtherData varchar(100))
CREATE TABLE #DateAndCreatedOn(Data decimal(10,4), CreatedOn date)
INSERT INTO #StartEndDates VALUES('2018-09-08', '2018-09-23', 'data 1')
INSERT INTO #StartEndDates VALUES('2018-07-08', '2018-08-01', 'data 2')
INSERT INTO #StartEndDates VALUES('2018-07-21', '2018-08-12', 'data 3')
--INSERT THIS ROW TO SEE DUPLICATE SomeOtherData
INSERT INTO #StartEndDates VALUES('2018-07-11', '2018-08-12', 'data 3')
INSERT INTO #DateAndCreatedOn VALUES(1.5,'2018-09-20')
INSERT INTO #DateAndCreatedOn VALUES(2.4,'2018-07-15')
INSERT INTO #DateAndCreatedOn VALUES(3.5,'2018-07-21')
--ORIGINAL QUERY
Select sed.someotherdata
, (select sum(data)
from #DateAndCreatedOn
where CreatedOn between sed.StartDate and sed.EndDate) as total
from #StartEndDates sed
--LEFT JOIN QUERY
SELECT
sed.someotherdata,
SUM(d.data) as total
FROM
#StartEndDates sed
LEFT JOIN #DateAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
sed.someotherdata
--CROSS APPLY QUERY
SELECT sed.SomeOtherData, x.SM
FROM #StartEndDates sed
CROSS APPLY (SELECT SUM(Data) SM from #DateAndCreatedOn d where d.CreatedOn between sed.StartDate and sed.EndDate) x