2013-02-26 48 views
0

我有如下数据:如何创建月份名称作为sql中给定日期范围的列名称?


country  date    value  
------------------------------------------------------ 
test1  5/1/2008   500 
test1  5/7/2008   200 
test1  5/8/2008   300 
test1  7/1/2008   100 
test1  7/2/2008   100 
test2  6/1/2008   100 

而且我想如下结果:

Result 
----------- 
countryName   May-08   Jun-08  July-08 
test1    1000    -   200 
test2     -    100 
+0

什么是你的数据库的SQL Server,MySQL或Oracle中,将其标记为 – vikas 2013-02-26 11:25:51

+0

其 – 2013-02-26 11:27:08

+0

你可以使用旋转功能 – vikas 2013-02-26 11:29:50

回答

0

这是从T-SQL Pivot? Possibility of creating table columns from row values

适应你可以看到它在这里工作:http://sqlfiddle.com/#!3/7b8c0/28

我想你可能需要反复折腾列排序

-- Static PIVOT 
SELECT * 
FROM (SELECT country, 
     CONVERT(char(3), date, 0) + '-' + 
     RIGHT(CONVERT(varchar, YEAR(date)), 2) AS date, 
     value 
FROM country) AS D 
PIVOT(SUM(value) FOR date IN([May-08],[Jun-08],[Jul-08])) AS P; 
GO 

-- Dynamic PIVOT 
DECLARE @T AS TABLE(y INT NOT NULL PRIMARY KEY); 

DECLARE 
@cols AS NVARCHAR(MAX), 
@y AS INT, 
@sql AS NVARCHAR(MAX) 

SELECT @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()] 
FROM (SELECT DISTINCT CONVERT(char(3), date, 0) + '-' + 
     RIGHT(CONVERT(varchar, YEAR(date)), 2) AS y 
     FROM Country 
    ) AS Y 
ORDER BY y desc 
FOR XML PATH('')), 
1, 1, N'') 

-- Construct the full T-SQL statement 
-- and execute dynamically 
SET @sql = N'SELECT * 
FROM (SELECT country, CONVERT(char(3), date, 0) + ''-'' + 
     RIGHT(CONVERT(varchar, YEAR(date)), 2) AS date, value 
FROM Country) AS D 
PIVOT(SUM(value) FOR date IN(' + @cols + N')) AS P;' 

EXEC sp_executesql @sql 
+0

'FOR XML PATH(''))是什么意思, 1,1,N'')'? – 2013-02-26 12:06:33

+0

将列名连接成字符串只是一个巧妙的技巧。有一篇文章在这里:http://www.mahipalreddy.com/blog/?p=79 – openshac 2013-02-26 12:14:16

+0

一个问题,我们可以创建一个月份名称在给定一个日期reange前,如果我给一个日期2008年5月1日至7/2/2008那么我怎样才能创建一个月5月,6月和7月作为列名?就像我们上面创建 – 2013-02-26 12:27:27