Sql 如何在动态透视中以MMM/YYYY格式对月份进行排序或排序

Sql 如何在动态透视中以MMM/YYYY格式对月份进行排序或排序,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我有下面的故事 我可以通过以下代码来维护列的顺序 select @cols = STUFF((SELECT distinct ',' + QUOTENAME(LOGDATE) from #TEMP FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 但我如何以2013年12月、2013年1月、2013年2月的格式维护日期

我有下面的故事

我可以通过以下代码来维护列的顺序

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(LOGDATE) 
               from #TEMP                    
               FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')
但我如何以2013年12月、2013年1月、2013年2月的格式维护日期

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


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

QUOTENAME(左(日期名称(月,日志日期),3)+'/'+CAST(年份(日志日期)为字符(4))

这将为您提供类似
[2013年12月]、[2014年2月]、[2014年1月]

更新:使用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)
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
| NAME | DEC/2013 | JAN/2014 | FEB/2014 |
|------|----------|----------|----------|
|    A |       97 |      200 |       40 |
|    B |       10 |       50 |       66 |
|    C |        4 |       25 |       87 |
查询1

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)
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
| NAME | DEC/2013 | JAN/2014 | FEB/2014 |
|------|----------|----------|----------|
|    A |       97 |      200 |       40 |
|    B |       10 |       50 |       66 |
|    C |        4 |       25 |       87 |

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)
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
| NAME | DEC/2013 | JAN/2014 | FEB/2014 |
|------|----------|----------|----------|
|    A |       97 |      200 |       40 |
|    B |       10 |       50 |       66 |
|    C |        4 |       25 |       87 |

我有自己的方法来解决这个问题

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

它不起作用。我在Pivot Msg 8114,16级,状态1,第9行将数据类型nvarchar转换为日期时遇到以下错误。Msg 473,16级,状态1,第9行PIVOT运算符中提供了不正确的值“Dec/2013”。@SarathAvanavu如果您将PIVOT代码添加到问题中,我可能会有所帮助。我已在问题中添加了PIVOT代码。请check@SarathAvanavu好的,我发现了一个小错误。我将用一个有效的例子更新我的答案。@SarathAvanavu刚刚注意到,在你接受我的答案八个月后,你没有接受我的答案。我有点好奇你为什么这么做?