2015-10-05 4 views
1

Кто-нибудь скажет мне, что случилось с моим SQL, с этим трудно справиться сегодня. Ошибка:Борьба с синтаксисом запросов SQL Pivot

Msg 156, Level 15, State 1, Line 11

Неправильный синтаксис около ключевого слова 'выберите'.

Msg 102, Level 15, State 1, Line 11

Неправильный синтаксис около ')'.

SELECT * 
FROM (
    SELECT 
     left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year], 
     count(*) as Total 
    FROM quotations 
) as s 
PIVOT 
(
    SUM(Total) 
    FOR [year] IN (select distinct year(TransactionDateTime) from quotations) 
) AS pivot 

Форма Я после того, как есть ... Так что года в качестве имен столбцов затем 12 строк на каждый месяц. Ниже только для иллюстрации форма

 // var data = google.visualization.arrayToDataTable([ 
     // ['Month', '2013', '2014', '2015'], 
     // ['Jan', 10, 30, 31], 
     // ['Feb', 11, 30, 32], 
     //]); 
+0

запрос кажется нормально для меня, я думаю, что стержень является зарезервированным словом, так что лучше использовать другой псевдоним или, по крайней мере, добавить скобки: в [ось] – Almazini

ответ

0

Синтаксис для поворота выглядит следующим образом (From TechNet):

PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], ... [last pivoted column]) 
) AS <alias for the pivot table> 

Вы можете увидеть, что внутри IN пункта должны быть имена столбцов, заключенные в [], которые могут быть проблема, если имена столбцов являются динамическими. Эту проблему можно легко решить, используя динамический SQL.

Вот пример:

DECLARE @cols AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(TransactionDateTime)) 
      FROM Quotations 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @query = 
    'SELECT * 
    FROM (
     SELECT 
      left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year], 
      count(*) as Total 
     FROM quotations 
    ) as s 
    PIVOT 
    (
     SUM(Total) 
     FOR [year] IN (' + @cols + ') 
    ) AS pivot' 

EXECUTE(@query) 

Я не знаю, что ваша схема, так что может быть ошибка с именами таблиц/столбцов. Если это не помогает, я могу быть более точным, если вы делитесь своей схемой и образцами данных.

+0

я добавил одну группу строку»на левой стороне (datename (месяц, TransactionDateTime), 3), год (TransactionDateTime) 'после «FROM Quotations» в вашем решении, и он РАБОТАЕТ! благодаря – John

0

Проблема заключается в следующем составе запроса

(select distinct year(TransactionDateTime) from quotations) 

Вы должны предоставить статический список лет внутри в п.

Смежные вопросы