2012-04-17 46 views

回答

1

事情是这样的:

测试数据

CREATE TABLE #tbl(date_a DATE,date_e DATE, vals FLOAT) 

INSERT INTO #tbl 
VALUES 
    ('2/29/2012','1/1/2013',28.47), 
    ('2/29/2012','2/1/2013',27.42), 
    ('2/29/2012','3/1/2013',24.36), 
    ('3/1/2012','1/1/2013',28.5), 
    ('3/1/2012','2/1/2013',27.35), 
    ('3/1/2012','3/1/2013',24.39), 
    ('3/6/2012','1/1/2013',27.75), 
    ('3/6/2012','2/1/2013',26.63), 
    ('3/6/2012','3/1/2013',23.66) 

查询

SELECT 
    * 
FROM 
( 
    SELECT 
     tbl.date_a, 
     tbl.date_e, 
     vals 
    FROM 
     #tbl AS tbl 
) AS SourceTable 
PIVOT 
(
    SUM(vals) 
    FOR date_e IN ([1/1/2013],[2/1/2013],[3/1/2013]) 
) AS pvt 

DROP TABLE #tbl 

编辑

如果你不知道有多少列,那么你需要做一个动态的pivot。就像这样:

独特的列

DECLARE @cols VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY date_e ORDER BY date_e) AS RowNbr, 
     tbl.* 
    FROM 
     #tbl AS tbl 
) 
SELECT @cols=STUFF 
(
    (
     SELECT 
      ',' +QUOTENAME(date_e) 
     FROM 
      CTE 
     WHERE 
      CTE.RowNbr=1 
     FOR XML PATH('') 
    ) 
,1,1,'') 

动态枢

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
( 
    SELECT 
     tbl.date_a, 
     tbl.date_e, 
     vals 
    FROM 
     #tbl AS tbl 
) AS SourceTable 
PIVOT 
(
    SUM(vals) 
    FOR date_e IN ('[email protected]+') 
) AS pvt' 
EXECUTE(@query) 
+0

负载的感谢,它的工作没有缺陷。一旦时钟达到两分钟屏障就会接受它:) – 2012-04-17 10:50:58

+0

没问题。很高兴帮助:P ..我给你添加了一个奖励例子:P ..请看看。 – Arion 2012-04-17 10:54:29

+0

这就是真棒!对不起请求更多.. :)谢谢很多陛下.. – 2012-04-17 11:14:43