Sql server 求和并在一条记录中显示
我有三张表:表1(AF)、表2(MC)和表3(SC) 我目前对这些表有如下查询:Sql server 求和并在一条记录中显示,sql-server,join,sum,Sql Server,Join,Sum,我有三张表:表1(AF)、表2(MC)和表3(SC) 我目前对这些表有如下查询: SELECT AF.[Product Number], AF.[Week End Date], AF.[Inv Change Cost], AF.[Gross Sales Lbs], AF.[Production Lbs], MC.[Actual Usage Cost] AS MeatCost, SC.[Actual Usage Cost] AS SeasonCost FROM Table1 AF FULL JOI
SELECT
AF.[Product Number],
AF.[Week End Date],
AF.[Inv Change Cost],
AF.[Gross Sales Lbs],
AF.[Production Lbs],
MC.[Actual Usage Cost] AS MeatCost,
SC.[Actual Usage Cost] AS SeasonCost
FROM Table1 AF
FULL JOIN Table2 MC ON MC.[Product Number] = AF.[Product Number] AND MC.[Week Ending Date] = AF.[Week End Date]
FULL 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'
返回以下内容:
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
但是,我希望能够计算出肉类和季节的总和,因此表格将如下所示:
Prod # | WE Date | IC Cost | Gross Sales | Prod Lbs | Meat Cost | Season Cost |
96443 2/4/2017 -123456 1000 2000 11000 30000
我尝试了以下语句,但我得到了两个总和的所有四条记录的总和,这不是我想要返回的值:
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];
返回以下结果:
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],
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';
但是,我得到的结果与上一次尝试的结果相同。你可以试试这个
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]
使用此示例并尝试类似的操作
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
我使用了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
你还有其他领域吗?什么是季节成本?我还有很多字段,但大多数字段都是各自表的唯一字段。您的查询工作正常,但需要知道96443产品编号之间的差异。。。如表3所示。它应该是相同的产品编号。是否需要为每个表指定产品编号为X?无骰子。它仍然重复了MC和SC的总和,我可能还需要合计总销售额和英镑。这与我将要提出的解决方案非常相似,即使用CTE代替JOINs.@digital.亚伦Show us中的子查询。我不使用很多CTE,我想看看。它使用相同的想法。找到肉类成本和季节成本的小计,然后将它们加入最终选择。我喜欢CTE,因为它们更易于阅读。这会起作用,除非我必须插入SQL Server上已有表中的值。。。。。这实用吗?等等!我在两个子查询中留下了一个小调,它可以工作!非常感谢您和@digital.亚伦的帮助!知道了。谢谢