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刚刚注意到,在你接受我的答案八个月后,你没有接受我的答案。我有点好奇你为什么这么做?