2017-04-04 7 views
0
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 

表2に複数の一致がある場合、 'TotalTons'が乗算されます。結合を削除してもOKですが、WHERE句のtable2の日付が必要です。複数の子テーブルのSUM合計が膨らんで戻った合計

サンプル:だから

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') 

結果

City TotalTons 
---- --------- 
Dallas 20 (should be 5) 
Kansas 17 (Correct) 

ダラス総トン5であるが、表2の5つの異なる行がRegId 20があるので、それが4回乗算されます。

SUMにt2の結果を乗算しないようにするにはどうすればよいですか?あなたがで参加置き換えることができ

答えて

1

が存在し、サブクエリ:

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 
+0

これは、ありがとうございます。一致する行が返されるのではなく、一致した場合にサブクエリから1が返されるため、これは機能しますか? – BattlFrog

+0

ほぼ。 existsは、いずれかの行またはローが条件に一致する場合にtrueを返します。 –

0

はこれを試してみてください。

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 

はそれがお役に立てば幸いです。 :)

関連する問題