Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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
Mysql 根据SQL中的不同元素,在单独的列中显示所需的总和结果_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 根据SQL中的不同元素,在单独的列中显示所需的总和结果

Mysql 根据SQL中的不同元素,在单独的列中显示所需的总和结果,mysql,sql,sql-server,Mysql,Sql,Sql Server,我是SQL新手,基本上我需要根据不同的元素在单独的列中求和结果 请在下图中找到我的表格和要求的结果 请指导我如何使用SQL查询,以获得所需的结果。您可以使用条件聚合: 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 whe

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

请在下图中找到我的表格和要求的结果


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

您可以使用条件聚合:

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;

您可以使用
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;
如果您的产品不受A、B、C和D的限制,您可以使用 下面是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
下面是示例数据

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
使用动态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

取决于产品集是固定的还是变化的。如果它是可变的,则需要动态SQL,而这又意味着您确实需要决定是否使用or,这是两个独立的产品。