必需的Sum根据SQL中的不同元素在单独的列中生成

时间:2017-12-28 12:47:28

标签: mysql sql sql-server

我是SQL的新手,基本上我需要根据不同的元素在单独的列中求和。

请在下图中找到我的表格和所需结果。

enter image description here

请指导我查询SQL查询,以获得所需的结果。

4 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

select payment,
       sum(case when product = 'A' then amount else 0 end) as a,
       sum(case when product = 'B' then amount else 0 end) as b,
       sum(case when product = 'C' then amount else 0 end) as c,
       sum(case when product = 'D' then amount else 0 end) as d,
       sum(amount) as total
from t
group by payment;

答案 1 :(得分:0)

您可以使用PIVOT来获得所需的结果

SELECT  * ,
    [A] + [B] + [C] + [D] AS Total
FROM    ( SELECT    Payment, Product, Amount FROM  Your_Table) tr 
PIVOT( SUM(Amount) FOR Product IN ( [A], [B], [C], [D] ) ) p;

答案 2 :(得分:0)

如果您的产品不受A,B,C和D限制,则可以使用dynamic SQL pivot query 以下是SQL Server的示例查询

DECLARE @products nvarchar(max)
SELECT @products =
 STUFF(
 (
  select distinct ',[' + product + ']'
  from Payments
  for xml path('')
 ),
 1,1,'')

declare @sql nvarchar(max)
set @sql = '
SELECT
 *
FROM (
 SELECT
  Payment AS '' '',
  Product,
  Amount
 from Payments
) Data
PIVOT (
 SUM(Amount)
 FOR Product
 IN (
' + @products + ' 
 )
) PivotTable'
exec sp_executesql @sql

答案 3 :(得分:0)

以下是样本数据

IF OBJECT_ID('tempdb..#t')IS NOT NULL
DROp TABLE #t
;with cte (Payment,Product,Amount)
AS
(
SELECT 'Cash','A',1         UNION ALL
SELECT 'Credit','B',2       UNION ALL
SELECT 'Credit','C',3       UNION ALL
SELECT 'Cash','D',5         UNION ALL
SELECT 'Cash','A',6         UNION ALL
SELECT 'Credit','B',23      UNION ALL
SELECT 'Credit','C',7       UNION ALL
SELECT 'Cash','D',11        UNION ALL
SELECT 'Cash','A',12        UNION ALL
SELECT 'Credit','B',14      UNION ALL
SELECT 'Credit','C',16      UNION ALL
SELECT 'Cash','D',26            
)
SELECT * INTO #t FROM cte

使用Dynamic Sql

DECLARE @DyColumn Nvarchar(max),
        @Sql Nvarchar(max),
        @ISNULLDyColumn Nvarchar(max),
        @SumCol Nvarchar(max)


SELECT @DyColumn=STUFF((SELECT DISTINCT ', '+QUOTENAME(Product) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @ISNULLDyColumn=STUFF((SELECT DISTINCT ', '+'ISNULL('+QUOTENAME(Product)+',''0'')' +' AS '+QUOTENAME(Product) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @SumCol=STUFF((SELECT DISTINCT ' + '+QUOTENAME(Product) FROM #t FOR XML PATH ('')),1,2,'')



SET @Sql='
SELECT *,('+@SumCol+') AS Total FROM
    (
    SELECT Payment,'+@ISNULLDyColumn+'
    FROM
    (
    SELECT * FROM #t
    )AS
    SRC
     PIVOT
    (
    SUM(AMOUNT) FOR Product IN ('+@DyColumn+')
     ) AS Pvt
    )dt
 '
 PRINT @Sql
 EXECUTE (@Sql)

结果

 Payment    A   B   C   D   Total
 ---------------------------------
 Cash      19   0   0   42  61
 Credit    0    39  26  0   65