如何以MMM / YYYY格式在Dynamic Pivot中对月份进行排序或订购

时间:2014-03-23 04:52:23

标签: sql sql-server sql-server-2008 sql-server-2008-r2

  

我有以下故事

enter image description here

我可以借助以下代码维护列的顺序

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(LOGDATE) 
               from #TEMP                    
               FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

但是,我如何以2013年1月/ 2013年2月的2013年12月的格式保存日期?

enter image description here

set @query = 'SELECT * from 
            (
                select name,logdate,value from #table                    
           ) x
            pivot 
            (
                 sum(value)
                for logdate in (' + @cols + ')
            ) p '

2 个答案:

答案 0 :(得分:2)

您可以尝试更改用于列名称的字符串,而不是 QUOTENAME(LOGDATE)使用此:

QUOTENAME(LEFT(DATENAME(MONTH,LOGDATE),3) + '/' + CAST(YEAR(LOGDATE) AS CHAR(4)))

这会为您提供[Dec/2013],[Feb/2014],[Jan/2014]

等列

更新:使用SQL Fiddle的工作示例

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中的转换类型来维护透视列中的日期顺序。