Mysql 根据SQL中的不同元素,在单独的列中显示所需的总和结果
我是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查询,以获得所需的结果。您可以使用条件聚合:
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,这是两个独立的产品。