2009-12-31 79 views
2

我有一个数据表下面给出:的SQL Server PIVOT列数据

DATE   Price 
----------  ------ 
31/12/2009 10 
31/12/2009 11 
31/12/2009 12 
30/12/2009 20 
30/12/2009 21 
30/12/2009 22 
29/12/2009 30 
29/12/2009 32 
29/12/2009 31 

我想这个数据转换下面给出:

31/12/2009 30/12/2009 29/12/2009 
---------- ---------- ---------- 
10   10   10 
11   11   11 
12   12   12 

但在日期列中的数值动态。所以,我不知道如何使用这个使用SQL Server透视。

可否请你让我知道如何得到这个数据。

下面给出的是复制这个场景脚本:

CREATE TABLE TEMP(EffectiveDate DATETIME,Price INT) 
INSERT INTO TEMP(EffectiveDate,Price) 
SELECT GETDATE(),10 
UNION ALL 
SELECT GETDATE(),11 
UNION ALL 
SELECT GETDATE(),12 
UNION ALL 
SELECT GETDATE()-1,20 
UNION ALL 
SELECT GETDATE()-1,21 
UNION ALL 
SELECT GETDATE()-1,22 
UNION ALL 
SELECT GETDATE()-2,30 
UNION ALL 
SELECT GETDATE()-2,32 
UNION ALL 
SELECT GETDATE()-2,31 

SELECT CONVERT(VARCHAR,EffectiveDATE,103) AS 'DATE',Price FROM Temp 

由于提前,

马赫什

+0

您的示例数据没有意义 – 2009-12-31 07:06:57

回答

4

OK,正如我所说,你的数据是没有意义的,但也许这可以帮助。

创建动态数据透视表的唯一方法是创建动态sql。

此外,PIVOT要求您使用汇总函数(SUM,AVG,COUNT)

好吧,让我们看看这可以帮助你。

CREATE TABLE #TEMP (EffectiveDate DATETIME,Price INT) 
INSERT INTO #TEMP(EffectiveDate,Price) 
SELECT GETDATE(),10 
UNION ALL 
SELECT GETDATE(),11 
UNION ALL 
SELECT GETDATE(),12 
UNION ALL 
SELECT GETDATE()-1,20 
UNION ALL 
SELECT GETDATE()-1,21 
UNION ALL 
SELECT GETDATE()-1,22 
UNION ALL 
SELECT GETDATE()-2,30 
UNION ALL 
SELECT GETDATE()-2,32 
UNION ALL 
SELECT GETDATE()-2,31 

DECLARE @Cols VARCHAR(MAX) 
SELECT @cols = COALESCE(@cols + ',[' + colName + ']', 
         '[' + colName + ']') 
FROM (
      SELECT DISTINCT 
        CONVERT(VARCHAR,EffectiveDATE,103) colName 
      FROM #TEMP 
     ) s 
ORDER BY colName DESC 

DECLARE @query VARCHAR(MAX) 
SET @query = N'SELECT * 
FROM 
(SELECT CONVERT(VARCHAR,EffectiveDATE,103) AS ''DATE'',Price 
      FROM #TEMP) p 
PIVOT 
(
SUM(Price) FOR DATE IN 
('+ 
@cols +') 
) AS pvt' 

EXECUTE(@query) 


DROP TABLE #TEMP 
+0

它工作。非常感谢。 – Mahesh 2009-12-31 07:50:10