Sql server 返回膨胀总计的多个子表的总计
如果表2中有多个匹配项,则将“TotalTons”乘以。如果我删除了join,它是可以的,但是我必须有WHERE子句的table2日期 样本:Sql server 返回膨胀总计的多个子表的总计,sql-server,tsql,Sql Server,Tsql,如果表2中有多个匹配项,则将“TotalTons”乘以。如果我删除了join,它是可以的,但是我必须有WHERE子句的table2日期 样本: TABLE1 - RegId (int) pk, RegDate (date), CityId, Tons1(int), Tons2(int) TABLE2 - RegId(int) fk, OtherDate (date) TABLE3 - id, City SELECT c.City , SUM(t1.Tons1 + t
TABLE1 - RegId (int) pk, RegDate (date), CityId, Tons1(int), Tons2(int)
TABLE2 - RegId(int) fk, OtherDate (date)
TABLE3 - id, City
SELECT c.City
, SUM(t1.Tons1 + t1.Tons2) as 'TotalTons'
FROM Table1 t1
JOIN Table2 t2 ON t1.RegId = t2.RegId
JOIN table3 c ON t1.CityId = c.Id
WHERE YEAR(t2.OtherDate) = '2016'
GROUP BY c.City
结果
TABLE1
(20, '2016-2-2', 3, 2, 3)
(21, '2016-4-12', 7, 3, 5)
(22, '2016-4-12', 7, 6, 3)
TABLE 2
(20, '2016-2-2')
(20, '2016-2-3')
(20, '2016-2-5')
(20, '2016-2-1')
(21, '2016-5-12')
(22, '2016-9-2')
TABLE 3
(3, 'Dallas')
(7, 'Kansas')
达拉斯的总吨数是5,但因为表2中有5行不同的Regid20,所以乘以4倍
如何使其停止将总和乘以t2结果?您可以使用exists和sub查询替换联接:
City TotalTons
---- ---------
Dallas 20 (should be 5)
Kansas 17 (Correct)
试试这个:
SELECT c.City
, SUM(t1.Tons1 + t1.Tons2) as 'TotalTons'
FROM Table1 t1
JOIN table3 c ON t1.CityId = c.Id
WHERE EXISTS (
SELECT 1
FROM Table2 t2
WHERE t2.RegId = t1.RegId
AND YEAR(t2.OtherDate) = '2016'
)
GROUP BY c.City
希望有帮助。:) 这很有效,谢谢。这是因为当存在匹配时,它只从子查询返回1,而不是返回匹配的行。如果任何行或ROE与条件匹配,则exists返回true。
DECLARE @TABLE1 TABLE(RegId INT,RegDate DATE, CityId INT, Tons1 INT, Tons2 INT)
INSERT INTO @TABLE1 VALUES
(20, '2016-2-2', 3, 2, 3),(21, '2016-4-12', 7, 3, 5),(22, '2016-4-12', 7, 6, 3)
DECLARE @TABLE2 TABLE(RegId INT,OtherDate DATE)
INSERT INTO @TABLE2 VALUES (20, '2016-2-2'),(20, '2016-2-3'),(20, '2016-2-5'),
(20, '2016-2-1'),(21, '2016-5-12'),(22, '2016-9-2')
DECLARE @TABLE3 TABLE(id INT,City NVARCHAR(10))
INSERT INTO @TABLE3 VALUES (3, 'Dallas'),(7, 'Kansas')
SELECT DISTINCT B.City,B.TotalTons FROM ( SELECT T2.*,CityId FROM @TABLE2 T2
LEFT JOIN @TABLE1 T1 ON T1.RegId = T2.RegId ) A LEFT JOIN (SELECT CityId,City, SUM(Tons1+Tons2) TotalTons
FROM @TABLE3 T3 LEFT JOIN @TABLE1 T1 ON T1.CityId = T3.id GROUP BY CityId,City ) B ON A.CityId = B.CityId
WHERE YEAR(OtherDate) = '2016' -- change your date clause