2017-02-15 37 views
2

に表示しますSUMと、JOINは、私は3つのテーブルを持っている一つのレコード

Prod # | WE Date | IC Cost | Gross Sales | Prod Lbs | Meat Cost | Season Cost | 
96443 2/4/2017 -123456 1000   2000  5000  10000 
96443 2/4/2017 -123456 1000   2000  5000  20000 
96443 2/4/2017 -123456 1000   2000  6000  10000 
96443 2/4/2017 -123456 1000   2000  6000  20000 

しかし、私はSUM肉と季節にできるようにしたいので、テーブルは次のようになります:

次を返します

私は次のステートメントを試してみたが、私は私が欲しい値が返されないの両方和について合計4つのすべてのレコードを取得しています:

Prod # | WE Date | IC Cost | Gross Sales | Prod Lbs | Meat Cost | Season Cost | 
96443 2/4/2017 -123456 1000   2000  22000  60000 

SELECT 
AF.[Product Number], 
AF.[Week End Date], 
AF.[Inv Change Cost], 
AF.[Gross Sales Lbs], 
AF.[Production Lbs], 
SUM(MC.[Actual Usage Cost]) AS MeatCost, 
SUM(SC.[Actual Usage Cost]) AS SeasonCost 
FROM Table1 AF 
JOIN Table2 MC ON MC.[Product Number] = AF.[Product Number] AND MC.[Week Ending Date] = AF.[Week End Date] 
JOIN Table3 SC ON SC.[Product Number] = AF.[Product Number] AND SC.[Week Ending Date] = MC.[Week Ending Date] 
WHERE 
AF.[Product Number] = '96443' AND 
AF.[Week End Date] = '2/4/2017' AND 
MC.[Rout Line Name] = 'Total Cost' AND 
SC.[Rout Line Name] = 'Total Cost' 
GROUP BY 
AF.[Product Number], 
AF.[Week End Date], 
AF.[Inv Change Cost], 
AF.[Gross Sales Lbs], 
AF.[Production Lbs]; 

の結果を返すに

希望の結果を得るために、すべてのフィールドを合計する必要がありますか?

UPDATE:私はこの文をしようとしました

SELECT 
AF.[Product Number], 
AF.[Week End Date], 
AF.[Inv Change Cost], 
AF.[Gross Sales Lbs], 
AF.[Production Lbs], 
MC.MeatCost, 
SC.SeasonCost 
FROM Table1 AF 
    JOIN(
     SELECT [Product Number], [Week Ending Date], SUM([Actual Usage Cost]) AS MeatCost 
     FROM Table2 
     GROUP BY [Product Number], [Week Ending Date] 
     )MC ON 
     AF.[Product Number] = MC.[Product Number] AND 
     AF.[Week End Date] = MC.[Week Ending Date] 
    JOIN(
     SELECT [Product Number], [Week Ending Date], SUM([Actual Usage Cost]) AS SeasonCost 
     FROM Table3 
     GROUP BY [Product Number], [Week Ending Date] 
     )SC ON 
     SC.[Product Number] = MC.[Product Number] AND 
     SC.[Week Ending Date] = MC.[Week Ending Date] 
WHERE 
AF.[Product Number] = '96443' AND 
AF.[Week End Date] = '2/4/2017'; 

しかし、私は前の試行と同じ結果を取得しています。

+0

これ以上のフィールドはありますか?シーズンコストとは何ですか? – manderson

+0

私はかなり多くのフィールドを持っていますが、それらのほとんどはそれぞれのテーブルにユニークです – jDave1984

+0

あなたのクエリは期待通りに機能しますが、96443の製品番号の違いを知る必要があります。 – manderson

答えて

2

この例を使用して、このような何かをしようと...これを試すことができます...

CREATE TABLE #Table1 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, InvChangeCost NUMERIC(18,2), GrossSales NUMERIC(18,2), ProductionLibs NUMERIC(18,2)) 

INSERT INTO #Table1(ProdNum ,WeekEndDate ,InvChangeCost ,GrossSales ,ProductionLibs) 
VALUES(96443, '2/4/2017', -123456, 1000,   2000) 

CREATE TABLE #Table2 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, MeatCost NUMERIC(18,2)) 

INSERT INTO #Table2(ProdNum ,WeekEndDate ,MeatCost) 
VALUES(96443, '2/4/2017', 5000) 
INSERT INTO #Table2(ProdNum ,WeekEndDate ,MeatCost) 
VALUES(96443, '2/4/2017', 6000) 

CREATE TABLE #Table3 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, SeasonCost NUMERIC(18,2)) 

INSERT INTO #Table3(ProdNum ,WeekEndDate ,SeasonCost) 
VALUES(96443, '2/4/2017', 1000) 
INSERT INTO #Table3(ProdNum ,WeekEndDate ,SeasonCost) 
VALUES(96443, '2/4/2017', 2000) 

SELECT t1.* 
     , t2.MeatCost 
     , t3.SeasonCost 
FROM #Table1 t1 
    JOIN (
      SELECT ProdNum, WeekEndDate, SUM(MeatCost) AS MeatCost 
      FROM #Table2 
      GROUP BY ProdNum, WeekEndDate 
     )t2 ON 
     t1.ProdNum = t2.ProdNum AND 
     t1.WeekEndDate = t2.WeekEndDate 
    JOIN (
      SELECT ProdNum, WeekEndDate, SUM(SeasonCost) AS SeasonCost 
      FROM #Table3 
      GROUP BY ProdNum, WeekEndDate 
     )t3 ON 
     t3.ProdNum = t2.ProdNum AND 
     t3.WeekEndDate = t2.WeekEndDate 


DROP TABLE #Table1 
DROP TABLE #Table2 
DROP TABLE #Table3 
+0

これは、JOINのサブクエリの代わりにCTEを使用することを提案しようとしていたソリューションと非常によく似ています。 –

+0

@ digital.aaron私たちを見せてください。私は多くのCTEを使用せず、見たいと思っています。 – manderson

+0

それは同じアイデアを使用します。肉コストと季節コストの小計を見つけて、それらを最終的なSELECTに結合します。私はCTEが好きです。なぜなら、CTEは読みやすくなる傾向があるからです。 –

0

あなたは

SELECT 
AF.[Product Number], 
MAX(AF.[Week End Date]), 
MAX(AF.[Inv Change Cost]), 
MAX(AF.[Gross Sales Lbs]), 
MAX(AF.[Production Lbs]), 
SUM(MC.[Actual Usage Cost]) AS MeatCost, 
SUM(SC.[Actual Usage Cost]) AS SeasonCost 
FROM Table1 AF 
JOIN Table2 MC ON MC.[Product Number] = AF.[Product Number] AND MC.[Week Ending Date] = AF.[Week End Date] 
JOIN Table3 SC ON SC.[Product Number] = AF.[Product Number] AND SC.[Week Ending Date] = MC.[Week Ending Date] 
WHERE 
AF.[Product Number] = '96443' AND 
AF.[Week End Date] = '2/4/2017' AND 
MC.[Rout Line Name] = 'Total Cost' AND 
SC.[Rout Line Name] = 'Total Cost' 
GROUP BY 
AF.[Product Number] 
+0

ダイスはありません。それでもMCとSCの合計が重複していたので、総売上とポンドを合計する必要があるかもしれません。 – jDave1984

2

私はMandersonの一時テーブルを使用してのCTEにサブクエリを並び替えます。

CREATE TABLE #Table1 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, InvChangeCost NUMERIC(18,2), GrossSales NUMERIC(18,2), ProductionLibs NUMERIC(18,2)) 

INSERT INTO #Table1(ProdNum ,WeekEndDate ,InvChangeCost ,GrossSales ,ProductionLibs) 
VALUES(96443, '2/4/2017', -123456, 1000,   2000) 

CREATE TABLE #Table2 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, MeatCost NUMERIC(18,2)) 

INSERT INTO #Table2(ProdNum ,WeekEndDate ,MeatCost) 
VALUES(96443, '2/4/2017', 5000) 
INSERT INTO #Table2(ProdNum ,WeekEndDate ,MeatCost) 
VALUES(96443, '2/4/2017', 6000) 

CREATE TABLE #Table3 (id INT IDENTITY(1,1), ProdNum INT, WeekEndDate DATETIME, SeasonCost NUMERIC(18,2)) 

INSERT INTO #Table3(ProdNum ,WeekEndDate ,SeasonCost) 
VALUES(96443, '2/4/2017', 1000) 
INSERT INTO #Table3(ProdNum ,WeekEndDate ,SeasonCost) 
VALUES(96443, '2/4/2017', 2000) 

;WITH cteMeatCost 
AS 
(
    SELECT ProdNum, WeekEndDate, SUM(MeatCost) AS MeatCost 
      FROM #Table2 
      GROUP BY ProdNum, WeekEndDate 
) 

,cteSeasonCost 
AS 
(
    SELECT ProdNum, WeekEndDate, SUM(SeasonCost) AS SeasonCost 
      FROM #Table3 
      GROUP BY ProdNum, WeekEndDate 
) 

SELECT t1.* 
     , t2.MeatCost 
     , t3.SeasonCost 
FROM #Table1 t1 
    JOIN cteMeatCost t2 ON 
     t1.ProdNum = t2.ProdNum AND 
     t1.WeekEndDate = t2.WeekEndDate 
    JOIN cteSeasonCost t3 ON 
     t3.ProdNum = t2.ProdNum AND 
     t3.WeekEndDate = t2.WeekEndDate 


DROP TABLE #Table1 
DROP TABLE #Table2 
DROP TABLE #Table3 
+0

入手しました。ありがとう。 – manderson

関連する問題