我有以下故事
我可以借助以下代码维护列的顺序
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(LOGDATE)
from #TEMP
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')
但是,我如何以2013年1月/ 2013年2月的2013年12月的格式保存日期?
set @query = 'SELECT * from
(
select name,logdate,value from #table
) x
pivot
(
sum(value)
for logdate in (' + @cols + ')
) p '
答案 0 :(得分:2)
您可以尝试更改用于列名称的字符串,而不是
QUOTENAME(LOGDATE)
使用此:
QUOTENAME(LEFT(DATENAME(MONTH,LOGDATE),3) + '/' + CAST(YEAR(LOGDATE) AS CHAR(4)))
这会为您提供[Dec/2013],[Feb/2014],[Jan/2014]
更新:使用SQL Fiddle的工作示例
MS SQL Server 2008架构设置:
create table pivot_test (name varchar(10), logdate datetime, value int)
insert pivot_test values
('A', '2014-01-01', 200),
('B', '2014-01-01', 50),
('C', '2014-01-01', 25),
('A', '2014-02-01', 40),
('B', '2014-02-01', 66),
('C', '2014-02-01', 87),
('A', '2013-12-01', 97),
('B', '2013-12-01', 10),
('C', '2013-12-01', 4)
查询1 :
DECLARE @cols NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(LEFT(DATENAME(MONTH,LOGDATE),3) + '/' + CAST(YEAR(LOGDATE) AS CHAR(4)))
FROM (SELECT DISTINCT logdate FROM pivot_test) x ORDER BY logdate FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
SELECT name, LEFT(DATENAME(MONTH,LOGDATE),3) + ''/'' + CAST(YEAR(LOGDATE) AS CHAR(4)) AS custom_logdate, value FROM pivot_test
) x
PIVOT
(
SUM(value)
FOR custom_logdate IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
<强> Results 强>:
| NAME | DEC/2013 | JAN/2014 | FEB/2014 |
|------|----------|----------|----------|
| A | 97 | 200 | 40 |
| B | 10 | 50 | 66 |
| C | 4 | 25 | 87 |
答案 1 :(得分:0)
我有自己的方法来解决这个问题
create table #TABLE (name varchar(10), logdate datetime, value int)
insert #TABLE values
('A', '2014-01-01', 200),
('B', '2014-01-01', 50),
('C', '2014-01-01', 25),
('A', '2014-02-01', 40),
('B', '2014-02-01', 66),
('C', '2014-02-01', 87),
('A', '2013-12-01', 97),
('B', '2013-12-01', 10),
('C', '2013-12-01', 4)
现在我们选择 MMM / YYYY 格式的列名称,订单基于logdate
列。
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + LEFT(DATENAME(MONTH,logdate),3)+'/'+CAST(YEAR(logdate) AS
VARCHAR(4)) + ']',
'[' + LEFT(DATENAME(MONTH,logdate),3)+'/'+CAST(YEAR(logdate) AS VARCHAR(4)) + ']')
FROM (SELECT DISTINCT logdate FROM #TABLE) PV
ORDER BY logdate
现在使用新列动态旋转,最后以 MMM / YYYY
格式按照完美顺序生成列注意:logdate
应为datetime/date
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
SELECT name, LEFT(DATENAME(MONTH,logdate),3)+''/''+CAST(YEAR(logdate) AS VARCHAR(4)) logdate, value FROM #TABLE
) x
PIVOT
(
SUM(value)
FOR logdate IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
像这样,您可以转换为任何日期格式,并可以通过编辑Pivot语句的SELECT @cols
和内部SELECT
中的转换类型来维护透视列中的日期顺序。