Неверный синтаксис около '1'.Ожидается ID, QUOTED_ID или '.'Ошибка с SQL Pivot - PullRequest
4 голосов
/ 18 февраля 2012

У меня есть таблица со статистикой для университетов, которая выглядит следующим образом:

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 в качестве заголовка столбца?

Я буду использовать это с ~ 260 000 строк (~ 300 столбцов и ~ 3000 строк)

Ответы [ 2 ]

9 голосов
/ 18 февраля 2012

Синтаксис для IN неверен:

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;
2 голосов
/ 18 февраля 2012

Учитывая, что вы хотите произвести как вывод, я не уверен, что вам нужно использовать оператор 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;

(Вы пропустили квадратные скобки [])

...