Pivot table error

浪子不回头ぞ 提交于 2020-01-07 04:49:06

问题


WHY, why, why? Do I get an error:

"Msg 325, Level 15, State 1, Line 17 Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel." For this query?

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: Tried to make a SQL Fiddle, and it choked when I went to "Build Schema." (SQL Noob) I pulled the types from SQL management studio's object explorer and copied some example data. But this is what I attempted:

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')
;

Conclusion: Thanks for all the help Bluefeet!

For anyone interested in this, his first answer WOULD HAVE worked if the SQL compatibility level was set correctly by my DBA. After trying his first answer I got a:

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

Because the DBA doesn't have the SQL Server configured with a compatibility level that supports the PIVOT statement.


回答1:


Your syntax is off. The PIVOT is doing the GROUP BY and an aggregation. It seems to me that you want to be using:

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;

See Demo

This will create a table of data with the counts of the dispositionid's for each week, grouped by the dispositiondesc.

Edit, this can also be done using an aggregate function with a CASE expression:

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;

See SQL Fiddle with Demo



来源:https://stackoverflow.com/questions/16492344/pivot-table-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!