![](/img/trans.png)
[英]Separating a column as a result in a query basing from row values in SQL Server
[英]SQL Server query result by column to row
这是我的示例代码:
我需要这样的结果:
category outlet1 outlet2 outlet3
Sale 70 20 40
Expense 250 130 200
我怎样才能做到这一点?
编辑:我的商店不固定,对不起,您事先没有告诉您。
您可以使用条件聚合来解决您的特定问题 :
SELECT c.category,
SUM(CASE WHEN o.outletname = 'Outlet1' THEN t.amt ELSE 0 END) as Outlet1,
SUM(CASE WHEN o.outletname = 'Outlet2' THEN t.amt ELSE 0 END) as Outlet2,
SUM(CASE WHEN o.outletname = 'Outlet3' THEN t.amt ELSE 0 END) as Outlet3
FROM tblcategory c INNER JOIN
tbltran t
ON t.catid = c.id INNER JOIN
tbloutlet o
ON o.id = t.outletid
GROUP BY c.category;
如果出口名称不固定,则需要动态SQL。 使用单个SELECT
查询无法解决该问题。
这里有动态插座http://sqlfiddle.com/#!18/a7b09/25
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(outletname)
from tbloutlet
group by outletname
order by outletname
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT category,' + @cols + ' from
(
SELECT c.category, o.outletname, SUM(t.amt) as amt
FROM tblcategory c
INNER JOIN tbltran t ON t.catid = c.id
INNER JOIN tbloutlet o ON o.id = t.outletid
GROUP BY c.category, o.outletname
) x
pivot
(
sum(amt)
for outletname in (' + @cols + ')
) p '
execute(@query);
您也可以使用PIVOT
运算符
SELECT *
FROM
(
SELECT category, outletname, amt
FROM tblcategory c
INNER JOIN tbltran t ON t.catid = c.id
INNER JOIN tbloutlet o ON o.id = t.outletid
) d
PIVOT
(
SUM(amt)
FOR outletname in ([Outlet1] , [Outlet2] , [Outlet3])
) p
编辑:以下是动态SQL版本
declare @Outlets nvarchar(max),
@SQL nvarchar(max)
select @Outlets = isnull(@Outlets + ',', '') + quotename(outlet)
from outlet
select @SQL = '
SELECT *
FROM
(
SELECT category, outletname, amt
FROM tblcategory c
INNER JOIN tbltran t ON t.catid = c.id
INNER JOIN tbloutlet o ON o.id = t.outletid
) d
PIVOT
(
SUM(amt)
FOR outletname in (' + @Outlets + ')
) p'
print @SQL -- print out for verification
exec sp_executesql @SQL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.