2013-07-04 2 views
0

안녕하세요. 직원이 펀치 인을 포함하고 계시 시스템의 데이터를 펀치 아웃하는 테이블이 있습니다. 동적으로 펀치 데이터 열을 피벗하고 직원 이동 범위를 합산하려고합니다. 그러나 동적 피벗 문제가 있습니다. 나는 몇 개의 다른 지위를 조사했다. 그러나 나는 어디에도 가지 않는 것처럼 보인다. 여기 SQL Server 동적 피벗

코드입니다 : 여기

USE wfcdb 
DECLARE @cols as NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(10),EVENTDTM,101)) as DATE FROM TIMESHEETITEM WHERE DATEDIFF(d,EVENTDTM,GetDate()) <7 ORDER BY DATE DESC 
         FOR XML PATH(''), TYPE 
         ).value('.','NVARCHAR(MAX)') 
         ,1,1,'') 

Set @query='SELECT EEID, ' + @cols + 'FROM (
SELECT p.PERSONnum as EEID,p.FULLNM as FULLNM, 
convert(varchar(10),ti.EVENTDTM,101) as PunchDate, 
DATEDIFF(MINUTE,ti.enddtm,ti.startdtm)/60*-1 AS SPAN 
FROM ((((( 
    TIMESHEETITEM ti With (NoLock) LEFT JOIN 
     PUNCHEVENT pe With (NoLock) ON ti.STARTPUNCHEVENTID = pe.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE ds ON pe.DATASOURCEID = ds.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT cc ON ds.CLIENTCONTEXTID = cc.CLIENTCONTEXTID) 
    LEFT JOIN  PUNCHEVENT AS pe1 With (NoLock) ON ti.ENDPUNCHEVENTID = pe1.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE AS ds1 ON pe1.DATASOURCEID = ds1.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT AS cc1 ON ds1.CLIENTCONTEXTID = cc1.CLIENTCONTEXTID 
    INNER JOIN PERSON p ON ti.EMPLOYEEID = p.PERSONID 
    INNER JOIN LABORACCT la1 ON la1.laboracctid = ti.laboracctid 
WHERE DATEDIFF(d,ti.EVENTDTM,GetDate()) <7 
AND ti.TmShtItemTypeID = 40 
AND (isnull(cc.CLNT,'') + isnull(cc1.CLNT,''))<> '') X 
PIVOT 
(
    SUM(SPAN) 
    FOR PunchDate in (' + @cols + ') 
    ) p' 

Execute(@query) 

그리고 나는 오류 메시지가 나타날 수 있습니다 :

메시지 105, 수준 15, 상태 1, 줄 17
닫히지 않은 인용 부호 문자가 후 문자열 ') X PIVOT (.....) p'.
메시지 102, 수준 15, 상태 1, 줄 17
근처의 구문이 잘못되었습니다 ') X
PIVOT (.....

어떤 도움을 주시면 감사하겠습니다.

+0

다음과 같이 변경해야합니다. 'AND (isnull (cc.CLNT,' ') + isnull (cc1.CLNT,' ')) <>' ') X' isnull (cc.CLNT, '' ') + isnull (cc1.CLNT,' '' ')) <>' '' ') X' – Lamak

답변

0

당신이 합치되어 있기 때문에 그래서 전체 코드가 될 것입니다

AND (isnull(cc.CLNT,'''') + isnull(cc1.CLNT,''''))<> '''') X 

: 동적 SQL에서 빈 문자열 당신은 몇 가지 더 작은 따옴표를 추가 할 필요가

DECLARE @cols as NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(10),EVENTDTM,101)) as DATE 
         FROM TIMESHEETITEM WHERE DATEDIFF(d,EVENTDTM,GetDate()) <7 ORDER BY DATE DESC 
         FOR XML PATH(''), TYPE 
         ).value('.','NVARCHAR(MAX)') 
         ,1,1,'') 

Set @query='SELECT EEID, ' + @cols + 'FROM (
SELECT p.PERSONnum as EEID,p.FULLNM as FULLNM, 
convert(varchar(10),ti.EVENTDTM,101) as PunchDate, 
DATEDIFF(MINUTE,ti.enddtm,ti.startdtm)/60*-1 AS SPAN 
FROM ((((( 
    TIMESHEETITEM ti With (NoLock) LEFT JOIN 
     PUNCHEVENT pe With (NoLock) ON ti.STARTPUNCHEVENTID = pe.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE ds ON pe.DATASOURCEID = ds.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT cc ON ds.CLIENTCONTEXTID = cc.CLIENTCONTEXTID) 
    LEFT JOIN  PUNCHEVENT AS pe1 With (NoLock) ON ti.ENDPUNCHEVENTID = pe1.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE AS ds1 ON pe1.DATASOURCEID = ds1.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT AS cc1 ON ds1.CLIENTCONTEXTID = cc1.CLIENTCONTEXTID 
    INNER JOIN PERSON p ON ti.EMPLOYEEID = p.PERSONID 
    INNER JOIN LABORACCT la1 ON la1.laboracctid = ti.laboracctid 
WHERE DATEDIFF(d,ti.EVENTDTM,GetDate()) <7 
AND ti.TmShtItemTypeID = 40 
AND (isnull(cc.CLNT,'''') + isnull(cc1.CLNT,''''))<> '''') X 
PIVOT 
(
    SUM(SPAN) 
    FOR PunchDate in (' + @cols + ') 
    ) p' 

execute @query 
+0

훌륭해, 내가 그것을 놓쳤다는 것을 믿을 수 없다. 감사합니다 – user2551567

+0

@ user2551567 그것은 쉽게 놓칠 수 있습니다. 이 버그를 잡는 한가지 방법은'print @ query'를 사용하고 결과를 SSMS에 붙여 넣으면 동적 SQL을 다룰 때 문제점을 발견 할 수 있습니다 – Taryn