如何使用SUM()并使用SQL将表合并到一个表中?
我尝试了使用如何使用SUM()并使用SQL将表合并到一个表中?,sql,sql-server,merge,Sql,Sql Server,Merge,我尝试了使用UNION,但它只返回了使用P4的结果。我现在拥有的是4个独立的SELECTquerys,它们与P3和P4的groupby具有相同的数据。因此,我想将这些数据合并到一个临时表中 如何: 首先将这些表合并到一个表中 然后对每个工厂的()列求和 如下图所示 SQL: DECLARE @Plants TABLE ( PlantName nvarchar(30), MaterialTotalPrice DECIMAL(18,2), SumLaborCost DECI
UNION
,但它只返回了使用P4
的结果。我现在拥有的是4个独立的SELECT
querys,它们与P3
和P4
的groupby
具有相同的数据。因此,我想将这些数据合并到一个临时表中
如何:
DECLARE @Plants TABLE
(
PlantName nvarchar(30),
MaterialTotalPrice DECIMAL(18,2),
SumLaborCost DECIMAL(18,2),
FinalCost DECIMAL(18,2)
)
DECLARE @PlantName nvarchar(30)
DECLARE @MaterialTotalPrice DECIMAL(18,2)
DECLARE @SumLaborCost DECIMAL(18,2)
DECLARE @FinalCost DECIMAL(18,2)
SELECT
@PlantName = GetTotalPrice.[PlantName]
,@MaterialTotalPrice = SUM(GetTotalPrice.[MaterialTotalPrice])
,@SumLaborCost = SUM(GetTotalPrice.[SumLaborCost])
,@FinalCost = SUM(GetTotalPrice.[FinalCost])
FROM
(
SELECT
TotalPriceMP4.[PlantName]
,SUM(TotalPriceMP4.[MaterialTotalPrice]) AS 'MaterialTotalPrice'
,SUM(TotalPriceMP4.[SumLaborCost]) AS 'SumLaborCost'
,SUM(TotalPriceMP4.[FinalCost]) AS 'FinalCost'
FROM Invoice1 AS TotalPriceMP4
GROUP BY TotalPriceMP4.[PlantName]
UNION
SELECT
TotalPriceMP4.[PlantName]
,SUM(TotalPriceMP4.[MaterialTotalPrice]) AS 'MaterialTotalPrice'
,SUM(TotalPriceMP4.[SumLaborCost]) AS 'SumLaborCost'
,SUM(TotalPriceMP4.[FinalCost]) AS 'FinalCost'
FROM Invoice2 AS TotalPriceMP4
GROUP BY TotalPriceMP4.[PlantName]
UNION
SELECT
TotalPriceMP3.[PlantName]
,SUM(TotalPriceMP3.[MaterialTotalPrice]) AS 'MaterialTotalPrice'
,SUM(TotalPriceMP3.[SumLaborCost]) AS 'SumLaborCost'
,SUM(TotalPriceMP3.[FinalCost]) AS 'FinalCost'
FROM Invoice3 AS TotalPriceMP3
GROUP BY TotalPriceMP3.[PlantName]
UNION
SELECT
TotalPriceMP3.[PlantName]
,SUM(TotalPriceMP3.[MaterialTotalPrice]) AS 'MaterialTotalPrice'
,SUM(TotalPriceMP3.[SumLaborCost]) AS 'SumLaborCost'
,SUM(TotalPriceMP3.[FinalCost]) AS 'FinalCost'
FROM Invoice4 AS TotalPriceMP3
GROUP BY TotalPriceMP3.[PlantName]
) AS GetTotalPrice
GROUP BY GetTotalPrice.[PlantName]
INSERT INTO @Plants(PlantName,
MaterialTotalPrice,
SumLaborCost,
FinalCost)
VALUES (@PlantName,
ISNULL(@MaterialTotalPrice,0),
ISNULL(@SumLaborCost,0),
ISNULL(@FinalCost,0))
SELECT * FROM @Plants
您离您的工作很近,您只需再次在最顶端选择分组即可 合并:-联合是一个屋顶中多个入口的好东西 为什么使用临时表?如果没有临时表,你会得到想要的东西
declare @t table ( planname varchar(50), finalcost float)
declare @t1 table ( planname varchar(50), finalcost float)
declare @t2 table ( planname varchar(50), finalcost float)
declare @t3 table ( planname varchar(50), finalcost float)
insert into @t values ( 'P3', 851872.651973)
insert into @t1 values ( 'P3', 1219860.129705)
insert into @t2 values ( 'P4', 7569113.509084)
insert into @t3 values ( 'P4', 24701896.712498)
select planname, SUM(finalcost) from
(
select planname, SUM(finalcost) finalcost from @t group by planname
union
select planname, SUM(finalcost) from @t1 group by planname
union
select planname, SUM(finalcost) from @t2 group by planname
union
select planname, SUM(finalcost) from @t3 group by planname
)
a group by planname
知道什么时候不单独使用union是非常重要的
declare @t table ( planname varchar(50), finalcost float)
declare @t1 table ( planname varchar(50), finalcost float)
declare @t2 table ( planname varchar(50), finalcost float)
declare @t3 table ( planname varchar(50), finalcost float)
insert into @t values ( 'P3', 100.00)
insert into @t1 values ( 'P3', 100.00)
insert into @t2 values ( 'P3', 100.00)
insert into @t3 values ( 'P3', 100.00)
select planname, SUM(finalcost) from
(
select planname, SUM(finalcost) finalcost from @t group by planname
union ALL
select planname, SUM(finalcost) from @t1 group by planname
union ALL
select planname, SUM(finalcost) from @t2 group by planname
union ALL
select planname, SUM(finalcost) from @t3 group by planname
)
a group by planname
;
结果=400
如果您单独使用union,结果将为100.00谢谢您的评论。但是,因为对于
P3
和P4
不仅有4个SELECT
查询。如果有超过20个查询,该怎么办?那么我必须申报20张桌子吗?好吧,那么现在你面临什么挑战?您可以使用temp table作为优化问题的declare关键字,也可以使用CTE进行优化。创建一个临时表占用内存,这样的事情可以通过以上建议避免,或者在需要太多时使用。我想添加更多SELECT
查询,然后我只使用groupby
和PlantName
。根据你的回答和我现在的问题。哪一个比另一个占用更多内存?UNION
是可选的,可以更改或删除。实际上,最好的解决方案也是解决优化问题。请注意UNION ALL(这也会减少工作量)UNION本身可能会给您带来不正确的结果您不应该使用UNION,请使用UNION ALL,如果UNION(单独使用)将在最终计算之前删除重复的行,您可能会得到不正确的结果。实际上,联合所有人的工作也更少(更快一点)。