Member 12770648 Ответов: 1

Имеют эту ошибку неправильный синтаксис около ключевого слова сообщения, "отмена сведения"


Имеют эту ошибку неправильный синтаксис около ключевого слова сообщения, "отмена сведения"


------------------------
---------UNPIVOT------------------
----------------------------------

SET @sql = @sql + ' UNPIVOT
(
OPINION_CNT FOR OPINIONS IN 
(ACCEPT_TAT,BEYOND_TAT,EXACT_TAT)
) '





--------------------------------------------------------------------------------------------------------
DECLARE @sql nvarchar(4000)
SET @sql = 'SELECT A.BRN_NAME ,A.PROD_SERV , A.COMP_TYPE,
P.PROD_SERV_TAT, 
COUNT(*) AS OVER_CNT ,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) < COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS ACCEPT_TAT,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) > COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS BEYOND_TAT,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) = COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS EXACT_TAT,
(SELECT COUNT(*) FROM RESPONSE BB WHERE A.BRN_NAME=BB.BRN_NAME) AS GRP_CNT ,OPINIONS,OPINION_CNT
FROM RESPONSE A

LEFT JOIN BRANCH C ON A.BRN_NAME = C.BRN_NAME
LEFT JOIN PROD_SERV P ON A.PROD_SERV = P.PROD_SERV_NAME
LEFT JOIN PAYMAST B ON A.LNAME = B.LNAME
AND A.FNAME = B.FNAME
AND A.EMPNO = B.EMPNO 
WHERE (A.COMP_DATE BETWEEN @CFROM AND @CTO)'


IF @CINCIDENT <>'ALL' 
BEGIN	
IF @CINCIDENT = 'OPENED' 
SET @sql = @sql + ' AND A.COMP_DATE+P.PROD_SERV_TAT >= GETDATE()' 
ELSE IF @CINCIDENT = 'CLOSED' 
SET @sql = @sql + ' AND A.COMP_DATE+P.PROD_SERV_TAT < GETDATE()
AND A.RESOLUTION_STAT_FRONT NOT IN ("BAD","UNHAPPY","UNSATISFACTORY")' 
ELSE IF @CINCIDENT = 'UNRESOLVED' 
SET @sql = @sql + ' AND A.COMP_DATE+P.PROD_SERV_TAT < GETDATE()
AND A.RESOLUTION_STAT_FRONT IN ("BAD","UNHAPPY","UNSATISFACTORY")' 
END
------------------------------------
---------BRANCH---------------------
------------------------------------	
IF @CDDL1 <>'ALL' 
SET @sql = @sql + ' AND C.BRN_NAME=@CDDL1' 


----------------------------------
---------UNPIVOT------------------
----------------------------------

SET @sql = @sql + ' UNPIVOT
(
OPINION_CNT FOR OPINIONS IN 
(ACCEPT_TAT,BEYOND_TAT,EXACT_TAT)
) '

-------------------------- 
--------------------------
---GROUPING & ORDERING---
--------------------------
--------------------------

SET @sql = @sql + ' GROUP BY A.BRN_NAME ,A.PROD_SERV , A.COMP_TYPE,
P.PROD_SERV_TAT '



--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Msg 156, Уровень 15, Состояние 1, Строка 17
Неверный синтаксис рядом с ключевым словом "UNPIVOT".

(1 ряд(ов) )





Что я делаю не так?

Пожалуйста помогите

Спасибо

Что я уже пробовал:

На ходу разработки рассмотрели ряд решений все безрезультатно

Maciej Los

Воспользуйся Печать способ отображения @sql переменное содержание. Тогда вы сможете определить, где вы допустили ошибку.

1 Ответов

Рейтинг:
8

Maciej Los

Как я уже упоминал в комментарии к этому вопросу, вы должны использовать Печать[^] метод определения того, где вы допустили ошибку.

Я проверил его и он возвращается:

SELECT A.BRN_NAME ,A.PROD_SERV , A.COMP_TYPE,
P.PROD_SERV_TAT, 
COUNT(*) AS OVER_CNT ,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) < COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS ACCEPT_TAT,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) > COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS BEYOND_TAT,
SUM(CASE WHEN DATEADD(DD,P.PROD_SERV_TAT, A.COMP_DATE) = COALESCE(A.DAT_COMP_INV_CLOSE0,A.DAT_COMP_INV_CLOSE,A.DATE_COMP_CLOS_FRMT)THEN 1 ELSE 0 END) AS EXACT_TAT,
(SELECT COUNT(*) FROM RESPONSE BB WHERE A.BRN_NAME=BB.BRN_NAME) AS GRP_CNT ,OPINIONS,OPINION_CNT
FROM RESPONSE A

LEFT JOIN BRANCH C ON A.BRN_NAME = C.BRN_NAME
LEFT JOIN PROD_SERV P ON A.PROD_SERV = P.PROD_SERV_NAME
LEFT JOIN PAYMAST B ON A.LNAME = B.LNAME
AND A.FNAME = B.FNAME
AND A.EMPNO = B.EMPNO 
WHERE (A.COMP_DATE BETWEEN @CFROM AND @CTO) UNPIVOT
(
OPINION_CNT FOR OPINIONS IN 
(ACCEPT_TAT,BEYOND_TAT,EXACT_TAT)
)  GROUP BY A.BRN_NAME ,A.PROD_SERV , A.COMP_TYPE,
P.PROD_SERV_TAT 


Взгляните на подчеркнутую строку. UNPIVOT инструкция находится сразу после а WHERE пункт. Правильный оператор SQL должен выглядеть следующим образом:

SELECT <unpivoted_columns>
FROM
(
   --pivoted data here
) AS pvt
UNPIVOT
(
   --
) AS unpvt


Таким образом, вы должны соответствующим образом изменить свой sql-код.
Примечание: Я бы изменил декларацию о @sql переменной: DECLARE @sql NVARCHAR(MAX) = N'';

Для получения более подробной информации, пожалуйста, смотрите: Использование PIVOT и UNPIVOT | Microsoft Docs[^]