2009-08-25 51 views
1
創建網格

我的SQL表有三列:SQL查詢 - 由三列

 
TaskID VarID Hours 
001  001  10 
001  002  40 
001  003  100 
002  001  50 
002  002  80 
002  003  90 

我要產生如以下

 
TaskID  VarID -> 001  002  003 
001     10  40  100 
002     50  80  90 

我想輸出有一些查詢或功能可以幫助我做到這一點。有任何想法嗎?

回答

1

是的,你可以很容易地在SQL Server 2005中做到這一點 - 神奇的詞是PIVOT

這裏有您需要查詢:

SELECT 
     TaskID, 
     [001], [002], [003] 
FROM 
    YourTable 
PIVOT 
    ( 
     SUM(HOURS) 
     FOR VarID IN ([001], [002], [003]) 
    ) 
    AS YourPivot 
ORDER BY 
     YourPivot.TaskID 

透視表的想法是有點棘手,在第一神交 - 也許這些信息的其他來源將幫助:

從MSDN的解釋可能會提供一些線索:

您可以使用PIVOT和UNPIVOT 關係運算符來改變 表值表達式到另一個 表。 PIVOT通過從一個列中的輸出轉動獨特 值在 表達爲多列在 旋轉的表值 表達,並且執行在那裏它們被要求在該是 希望在最終的任何 其餘列值聚合 輸出。 UNPIVOT 通過將 表值表達式的列轉換爲 值來執行與 PIVOT相反的操作。

所以你基本上可以帶可變VarID並把它的不同的值(001,002,003)及以上的合計(SUM(小時))到一個新的「支點」表的列。

Marc

0

您需要一個交叉表查詢。不幸的是,這在SQL Server中並不容易。在MS Access中非常容易(有一個嚮導可以幫助您。)

您需要使用PIVOT功能。我使用一個存儲過程是這樣的:

CREATE PROCEDURE [dbo].[usp_pivot_sa_byHomeCare] AS 
    DECLARE @columns VARCHAR(1000) 

    SELECT @columns = COALESCE(@columns + ',[' + cast(HomeCareRating as varchar) + ']', 
    '[' + cast(HomeCareRating as varchar)+ ']') 
    FROM vw_sa_byHomeCare 
    GROUP BY HomeCareRating 
    --print @columns 

    DECLARE @query VARCHAR(8000) 

    SET @query = ' 
    SELECT * 
    FROM vw_sa_byHomeCare 
    PIVOT 
    (
    sum(count_pmin) 
    FOR [HomeCareRating] 
    IN (' + @columns + ') 
    ) 
    AS p' 

    --print @query 

    EXECUTE(@query) 

在我的視圖(vw_sa_byHomeCare)是我想轉動的觀點,HomeCareRating是轉動在列,總和(count_pmin)是我的價值。