2012-02-18 253 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