2013-05-10 8 views
0

ПОЧЕМУ, почему, почему? Я получаю сообщение об ошибке:Ошибка сводной таблицы

«Msg 325, уровень 15, состояние 1, строка 17 Неверный синтаксис рядом с« PIVOT ». Возможно, вам потребуется установить уровень совместимости текущей базы данных на более высокое значение, чтобы включить эту функцию См. Справку для хранимой процедуры sp_dbcmptlevel. " Для этого запроса?

WITH Offnet7 AS (
    SELECT disposition.dispositiondesc, interaction.dispositionid, DATEPART(wk,interaction.ibegintime) as iWeek 

    FROM interaction INNER JOIN 
      disposition ON interaction.reasonid = disposition.dispositionid 

    WHERE interaction.dispositionid = 10 and (reasonid = 20365 or reasonid = 20366 or reasonid = 11168) and 
      interaction.ibegintime >= '2013-1-1' and 
      interaction.ibegintime < '2014-1-1' 
) 

SELECT iWeek, dispositiondesc, count(iWeek) as 'OffnetCounts' 
FROM Offnet7 

Group by dispositiondesc, iWeek 

PIVOT 
(
    OffnetCounts 
    for iWeek in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15]) 
) AS counts 

EDIT: «Построение схемы» Пытался сделать SQL скрипку, и он задохнулся, когда я пошел (SQL Noob) Я вытащил типы из объектного проводника студии управления SQL и скопировал некоторые данные примера. Но это то, что я пытался:

CREATE TABLE interaction 
    ([reasonid] int, [dispositionid] int, [ibegintime] datetime) 
; 

INSERT INTO interaction 
    ([reasonid], [dispositionid], [ibegintime]) 
VALUES 
    (20366, 10, '2012-01-31 23:59:48.000'), 
    (20366, 10, '2012-02-07 14:03:01.000'), 
    (20366, 10, '2012-02-07 14:06:48.000'), 
    (20366, 10, '2012-02-13 21:44:10.000'), 
    (20366, 10, '2012-02-27 21:36:33.000') 
; 


CREATE TABLE disposition 
    ([dispositionid] int, [predefined] int, [dispositiondesc] varchar(64), [displayvalue] varchar(254)) 
; 

INSERT INTO disposition 
    ([dispositionid], [predefined], [dispositiondesc], [displayvalue]) 
VALUES 
(10, 1, 'TRANSFERRED OFFNET', 'TRANSFERRED OFFNET'), 
    (11168, 0, 'TAKEDA PASSWORD', 'TAKEDA PASSWORD'), 
    (15433, 0, 'Voice Mail - TAKEDAEMEA', 'Voice Mail - TAKEDAEMEA'), 
    (20365, 0, 'TAKEDA iPAD, iPhone or BlackBerry', 'TAKEDA iPAD, iPhone or BlackBerry'), 
    (20366, 0, 'TAKEDA Concur', 'TAKEDA Concur') 
; 

Заключение: Спасибо за помощь Bluefeet!

Для всех, кто интересуется этим, его первый ответ БЫЛО работал, если бы уровень совместимости SQL был правильно установлен моим администратором баз данных. После попытки его первый ответ, который я получил:

"Msg 102, Level 15, State 1, Line 19 Incorrect syntax near '('." 

Поскольку DBA не имеет SQL Server, сконфигурированный с уровнем совместимости, который поддерживает оператор PIVOT.

ответ

2

Ваш синтаксис выключен. PIVOT выполняет GROUP BY и агрегацию. Мне кажется, что вы хотите использовать:

WITH Offnet7 AS 
(
    SELECT disposition.dispositiondesc, 
    interaction.dispositionid, 
    DATEPART(wk,interaction.ibegintime) as iWeek 
    FROM interaction 
    INNER JOIN disposition 
    ON interaction.reasonid = disposition.dispositionid 
    WHERE interaction.dispositionid = 10 
    and (reasonid = 20365 or reasonid = 20366 or reasonid = 11168) 
    and interaction.ibegintime >= '2013-1-1' 
    and interaction.ibegintime < '2014-1-1' 
) 
SELECT dispositiondesc, 
    [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15] 
FROM Offnet7 
PIVOT 
(
    count(dispositionid) 
    for iWeek in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15]) 
) AS counts; 

См Demo

Это создаст таблицу данных с графами в dispositionid-х на каждую неделю, сгруппированных по dispositiondesc.

Edit, это также может быть сделано с помощью агрегатной функции с CASE выражением:

SELECT disposition.dispositiondesc, 
    sum(case when DATEPART(wk,interaction.ibegintime) = 1 then 1 else 0 end) [1], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 2 then 1 else 0 end) [2], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 3 then 1 else 0 end) [3], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 4 then 1 else 0 end) [4], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 5 then 1 else 0 end) [5], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 6 then 1 else 0 end) [6], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 7 then 1 else 0 end) [7], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 8 then 1 else 0 end) [8], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 9 then 1 else 0 end) [9], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 10 then 1 else 0 end) [10], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 11 then 1 else 0 end) [11], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 12 then 1 else 0 end) [12], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 13 then 1 else 0 end) [13], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 14 then 1 else 0 end) [14], 
    sum(case when DATEPART(wk,interaction.ibegintime) = 15 then 1 else 0 end) [15] 
FROM interaction 
INNER JOIN disposition 
    ON interaction.reasonid = disposition.dispositionid 
WHERE interaction.dispositionid = 10 
    and (reasonid = 20365 or reasonid = 20366 or reasonid = 11168) 
    and interaction.ibegintime >= '2013-1-1' 
    and interaction.ibegintime < '2014-1-1' 
group by disposition.dispositiondesc; 

См SQL Fiddle with Demo

+0

Я до сих пор получаю «Msg 102, Level 15, State 1, Line 19 Некорректное Синтаксис near '('. "Ошибка в этом? Насколько я могу судить, это выглядит нормально? (Я SQL noob, хотя.) – NoMoreZealots

+0

@NoMoreZealots Можете ли вы создать скрипт sql с некоторыми примерами данных? – Taryn

+0

Если это так, синтаксическая ошибка заключается в том, что поможет? – NoMoreZealots

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