如何在sql中为给定日期范围创建月份名称作为列名?

时间:2013-02-26 11:20:55

标签: sql sql-server

我有如下数据:


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 

2 个答案:

答案 0 :(得分:0)

你必须使用一个相当复杂的查询,使用它认为的LOOP

要创建动态列名,请查看以下帖子:https://stackoverflow.com/a/10926106/1321564

使用sql server,您可以获得一些优势:https://stackoverflow.com/a/5638042/1321564

答案 1 :(得分: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