如何对 SQL Server 2008 透视结果列和行进行排序?
How do I sort a SQL Server 2008 pivot result columns and rows?
我正在使用 This 获取 table 的数据透视结果。但我希望结果列和行都按特定顺序排列。因此,行将按 CDATE
排序,列将是 CDATE
、BALANCE
,然后是 DATE
列。
CDATE | BALANCE | 04-2007 | 05-2007 | 06-2007 | TRANS TOT
2003-01-15 | 5000 | 60 | 0 | 0 | 60
2003-02-15 | 4000 | 40 | 0 | 0 | 40
2003-03-15 | 5500 | 20 | 15 | 15 | 50
我编辑了您在问题中提供的 link 中的答案以实现排序问题。只需将 ORDER BY
子句添加到您的动态查询:
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p ORDER BY date, ' + @cols
Execute(@query)
drop table temp
或者您可以使用 common table expression 来实现。像下面这样:
set @query = 'WITH CTE_1(date, ' + @cols + ') AS (SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p ) SELECT * FROM CTE_1 ORDER BY date, ' + @cols
我正在使用 This 获取 table 的数据透视结果。但我希望结果列和行都按特定顺序排列。因此,行将按 CDATE
排序,列将是 CDATE
、BALANCE
,然后是 DATE
列。
CDATE | BALANCE | 04-2007 | 05-2007 | 06-2007 | TRANS TOT
2003-01-15 | 5000 | 60 | 0 | 0 | 60
2003-02-15 | 4000 | 40 | 0 | 0 | 40
2003-03-15 | 5500 | 20 | 15 | 15 | 50
我编辑了您在问题中提供的 link 中的答案以实现排序问题。只需将 ORDER BY
子句添加到您的动态查询:
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p ORDER BY date, ' + @cols
Execute(@query)
drop table temp
或者您可以使用 common table expression 来实现。像下面这样:
set @query = 'WITH CTE_1(date, ' + @cols + ') AS (SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p ) SELECT * FROM CTE_1 ORDER BY date, ' + @cols