Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SUM()并使用SQL将表合并到一个表中?_Sql_Sql Server_Merge - Fatal编程技术网

如何使用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
具有相同的数据。因此,我想将这些数据合并到一个临时表中

如何:

  • 首先将这些表合并到一个表中
  • 然后对每个工厂的()列求和
  • 如下图所示

    SQL:

    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(单独使用)将在最终计算之前删除重复的行,您可能会得到不正确的结果。实际上,联合所有人的工作也更少(更快一点)。