2012-02-18 280 views
3

我有統計表格的大學,看起來像這樣:「1」附近的語法錯誤。期待ID,QUOTED_ID或'。'與SQL樞軸錯誤

StatID | UniversityID | StatValue 
1  | 1   | 100 
2  | 1   | 90 
3  | 1   | 80 
1  | 2   | 50 
2  | 2   | 55 

我想查詢返回的東西是這樣的:

(Rows are StatIDs, Columns are UniversityIDs) 
StatID | 1    | 2    | 3 
1  | 100   | 50   | NULL 
2  | 90   | 55   | NULL 
3  | 80   | NULL   | NULL 

這裏是我的查詢:

SELECT StatID, 1, 2, 3 
FROM 
    (SELECT StatID, UniversityID, StatValue FROM @table) up 
PIVOT 
    (MAX(StatValue) FOR UniversityID IN (1, 2, 3)) AS pvt 
ORDER BY StatisticID; 

我得到一個錯誤的FOR UniversityID IN (1,說:

Incorrect syntax near '1'. Expecting ID, QUOTED_ID, or '.'. 

我在做什麼錯?它是否與int作爲列標題有關?

我會用這與26萬〜行(約300列和3000〜行)

+0

您試過的查詢是什麼? – 2012-02-18 05:17:59

回答

8

你必須爲在錯誤的synatx:

SELECT StatisticID, 1, 2, 3 
FROM 
    (SELECT StatisticID, UniversityID, Value 
    FROM @table) up 
PIVOT 
    (MAX(Value) FOR UniversityID IN ([1], [2], [3])) AS pvt 
ORDER BY StatisticID; 
+0

你真的想在這裏使用MAX聚合器嗎?我認爲你需要SUM,儘管如果你只有一個值,那麼你選擇什麼聚合器並不重要,因爲在這種情況下,SUM和MAX將是相同的(MIN也是如此) – 2012-02-18 05:45:33

2

由於要產生作爲輸出什麼,我不知道你需要使用PIVOT操作。 你可以得到相當接近你用下面的查詢上面有輸出:

SELECT s.StatID 
     ,UniversityID1 = SUM(CASE WHEN UniversityID = 1 THEN StatValue ELSE NULL END) 
     ,UniversityID2 = SUM(CASE WHEN UniversityID = 2 THEN StatValue ELSE NULL END) 
     ,UniversityID3 = SUM(CASE WHEN UniversityID = 3 THEN StatValue ELSE NULL END) 
    FROM StatsTable s 
GROUP BY s.StatID 

這將產生

StatID | UniversityID1 | UniversityID2 | UniversityID3 
1  | 100   | 50   | NULL 
2  | 90   | 55   | NULL 
3  | 80   | NULL   | NULL 

它不具備的最後一行StatID = 4,但我不知道爲您提供了什麼值,因爲所有值均爲NULL,並且輸入表中沒有StatID = 4數據。

如果你真的想PIVOT語法,那就是:

SELECT StatID 
     ,UniversityID1 = [1] 
     ,UniversityID2 = [2] 
     ,UniversityID3 = [3] 
    FROM 
     (SELECT StatID, UniversityID, StatValue FROM @table) up 
PIVOT 
     (SUM(StatValue) FOR UniversityID IN ([1], [2], [3])) AS pvt 
ORDER BY StatID; 

(你失蹤的方括號[])

+0

對不起,我只是用我最好的嘗試修改了這個問題 – Greg 2012-02-18 05:25:51