Click here to Skip to main content
15,891,136 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Have this Error Message Incorrect Syntax near the keyword UNPIVOT


SQL
------------------------
---------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, Level 15, State 1, Line 17
Incorrect syntax near the keyword 'UNPIVOT'.

(1 row(s) affected)





What am I doing wrong ?

Please assist

Thanks

What I have tried:

On going development reviewed a number of solutions all to o avail
Posted
Updated 3-May-18 21:46pm
v3
Comments
Maciej Los 4-May-18 3:32am    
Use Print method to display @sql variable content. Then you'll be able to detect where you've made mistake.

1 solution

As i mentioned in the comment to the question, you have to use Print[^] method to detect where you've made mistake.

I tested it and it returns:
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) 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 


Take a look at underlined line. UNPIVOT instruction is right after a WHERE clause. A proper SQL statement should looks like:

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


So, you have to change your sql code accordingly.
Note: i'd change declaration of @sql variable to: DECLARE @sql NVARCHAR(MAX) = N'';

For further details, please see: Using PIVOT and UNPIVOT | Microsoft Docs[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900