use*_*947 4 sql-server pivot dynamic-sql
我的表是这样的:
Sitecode Month Amount
-------- ----- ------
XX Jan 1000
XX Jan 3000
XX Apr 3000
XX Apr 1000
Run Code Online (Sandbox Code Playgroud)
我想要的是,显示这样的结果:
Sitecode MonthJAN MonthAPR
-------- -------- --------
XX 4000 4000
Run Code Online (Sandbox Code Playgroud)
Tar*_*ryn 19
正如其他人所说,这被称为PIVOT
. 您可以通过多种方式将数据从行转换为数据列。
如果您提前知道这些值,那么您可以对这些值进行硬编码。在该PIVOT
函数之前,您将使用带有CASE
语句的聚合函数。
聚合/案例版本:
select sitecode,
sum(case when [month] = 'Jan' then amount else 0 end) MonthJan,
sum(case when [month] = 'Apr' then amount else 0 end) MonthApr
from yourtable
group by sitecode;
Run Code Online (Sandbox Code Playgroud)
该PIVOT
函数在 SQL Server 2005 中可用,因此如果您使用的是该版本或更新的版本,则可以将其应用于您的数据。
静态枢轴:
select *
from
(
select sitecode,
[month],
amount
from yourtable
) src
pivot
(
sum(amount)
for month in (Jan, Apr)
) piv;
Run Code Online (Sandbox Code Playgroud)
如果您提前知道这些值,则上述两个版本效果很好。如果没有,那么您将使用动态 sql 来创建结果。
动态枢轴:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT sitecode,' + @cols + ' from
(
select sitecode, [month], amount
from yourtable
) x
pivot
(
sum(amount)
for month in (' + @cols + ')
) p '
execute(@query)
Run Code Online (Sandbox Code Playgroud)
这的所有 3 个版本都将返回相同的结果:
| SITECODE | JAN | APR |
--------------------------
| XX | 4000 | 4000 |
Run Code Online (Sandbox Code Playgroud)
正如马丁史密斯所说,您需要对数据进行透视,无论是使用显式 PIVOT 作为引用还是类似这样的(SQL Fiddle):
SELECT SiteCode
, SUM(Case When Month='Jan' Then Amount Else 0 End) MonthJan
, SUM(Case When Month='Apr' Then Amount Else 0 End) MonthApr
FROM Result GROUP BY SiteCode;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
68597 次 |
最近记录: |