2012-05-07 4 views
3

기본적으로 각 피고용인 당 비용 코드 당 total_work_hours를 표시하는 피벗 쿼리를 만들었습니다.피벗에 표시된 중복 행 제거

이 내 원하는 출력 :

employeeno 8322.170 10184.2648 8321.169 10184.2649 <- costcodes 
-------------------------------------------------------------------------- 
080418   10.00   1.50  NULL   NULL 
080441   6.50   NULL  1.00   3.00 

그러나 이것은 내 쿼리의 결과입니다

 employeeno costcoding hour_per_costcode   
     -------------------------------------------------- 
     PH080418 8322.170  10.00 
     PH080418 10184.2648  1.50 
     PH080441 8321.169  1.00 
     PH080441 8322.170  6.50 
     PH080441 10184.2649  3.00 

이 :

employeeno 8322.170 10184.2648 8321.169 10184.2649 <- costcodes 
-------------------------------------------------------------------------- 
080418   10.00   NULL  NULL   NULL 
080418   NULL   1.50  NULL   NULL 
080441   NULL   NULL  1.00   NULL 
080441   6.50   NULL  NULL   NULL 
080441   NULL   NULL  NULL   3.00 

이 내 내부 쿼리의 결과는 내 검색어 :

WITH PivotData AS 
    (SELECT wa.id,wa.sitecode, wa.companycode, wa.startdate, wa.enddate, 
      wa.description, wa.ratetypeid, wa_details.employeeno, 
      CAST(wa_details.costcode AS NVARCHAR(MAX)) + '.' + 
      CAST(wa_details.subcostcode AS NVARCHAR(MAX)) costcoding , 
      wa_details.subcostcode, wa_details.hrswork [hour_per_costcode], 
      view_ttl_hours.ttl_work_hrs 
     FROM workallocation wa 
     INNER JOIN workallocation_details wa_details 
     ON wa.id = wa_details.workallocationid 
     INNER JOIN 
      (SELECT SUM(ttl_work_hrs) ttl_work_hrs, employee_id 
       FROM vwu_SUM_TIMESHEET_DAILY 
       WHERE TKSDATE BETWEEN '02-09-2012' AND '02-09-2012' 
       GROUP BY employee_id 
      ) view_ttl_hours 
     ON wa_details.employeeno=view_ttl_hours.employee_id WHERE wa.id=99 
    ) 
SELECT employeeno, [8322.170], [10184.2648], [8321.169], [10184.2649] 
    FROM PivotData 
PIVOT (MAX([hour_per_costcode])   
     FOR costcoding   
     IN ([8322.170], [10184.2648], [8321.169], [10184.2649]) 
     ) AS PivotResult 
ORDER BY employeeno; 

내 질문에 내 원하는 결과가 달성 될 수 있도록 여러 행에 대한 값을 어떻게 통합 할 수 있습니까? 또한 크로스 탭 쿼리를 시도하지만 결과도 동일합니다.

이 문제를 해결하는 방법에 대한 지침이 필요합니다. 도울 수 있니?

+0

당신이 마지막 쿼리에서 선택을 변경하면'SELECT *'원인을 꽤 명백해야한다입니다 문제. 필자가 제안 할 수있는 다른 권장 사항은 피벗에서 직접 사용하지 않는 PivotData의 모든 것을 제거하는 것입니다. – cadrell0

+0

@ cadrell0 - 답장을 보내 주셔서 감사합니다. 나는 이미 오래 전에 복제본을 보았지만 내 세부 테이블은 employeeno, 비용 코드, subcostcode 및 hrswork로 구성되어 있습니다. 모두 고유 키입니다. –

+0

@ cadrell0 님의 의견에 근거합니다. (예 : PivotData2와 같이 (PivotData에서 [employereen, [8322.170], [10184.2648] ...을 선택하십시오.))와 같은'with' 절에 다른 쿼리를 추가 한 다음 마지막 쿼리를 SELECT * ... FROM PivotData2로 변경하십시오. . – fankt

답변

4

CTE에서 필요없는 열을 제거하십시오. 이 같은 것이 당신을 위해 일해야합니다. 데이터와 쿼리 위

WITH PivotData AS 
    (SELECT wa_details.employeeno, 
      CAST(wa_details.costcode AS NVARCHAR(MAX)) + '.' + 
      CAST(wa_details.subcostcode AS NVARCHAR(MAX)) costcoding , 
      wa_details.subcostcode, wa_details.hrswork [hour_per_costcode] 
     FROM workallocation wa 
     INNER JOIN workallocation_details wa_details 
     ON wa.id = wa_details.workallocationid 
     INNER JOIN 
      (SELECT SUM(ttl_work_hrs) ttl_work_hrs, employee_id 
       FROM vwu_SUM_TIMESHEET_DAILY 
       WHERE TKSDATE BETWEEN '02-09-2012' AND '02-09-2012' 
       GROUP BY employee_id 
      ) view_ttl_hours 
     ON wa_details.employeeno=view_ttl_hours.employee_id WHERE wa.id=99 
    ) 
SELECT employeeno, [8322.170], [10184.2648], [8321.169], [10184.2649] 
    FROM PivotData 
PIVOT (MAX([hour_per_costcode])   
     FOR costcoding   
     IN ([8322.170], [10184.2648], [8321.169], [10184.2649]) 
     ) AS PivotResult 
ORDER BY employeeno; 

:

WITH PivotData AS 
    (select 'PH080418' as employeeno, 8322.170 as costcoding, 10.00 as hour_per_costcode union all 
    select 'PH080418', 10184.2648, 1.50 union all 
    select 'PH080441', 8321.169, 1.00 union all 
    select 'PH080441', 8322.170, 6.50 union all 
    select 'PH080441', 10184.2649, 3.00 
    ) 
SELECT employeeno, [8322.170], [10184.2648], [8321.169], [10184.2649] 
    FROM PivotData 
PIVOT (MAX([hour_per_costcode])   
     FOR costcoding   
     IN ([8322.170], [10184.2648], [8321.169], [10184.2649]) 
     ) AS PivotResult 
ORDER BY employeeno; 

결과 :

employeeno 8322.170 10184.2648 8321.169 10184.2649 
---------- ---------- ------------ ---------- ----------- 
PH080418 10.00  1.50   NULL  NULL 
PH080441 6.50  NULL   1.00  3.00 
+0

늦게 답장을 보내 주셔서 감사합니다. 아무도 내 문제를 이해하지 못한다고 생각합니다. 나는 고유 한 행을 원한다. 제 설명을 읽어주세요. 감사! –

+0

@ user1378857 내가 제공 한 쿼리를 사용해 보셨습니까? 출력은 무엇입니까? –

+0

네, 네가 나에게 준 쿼리를 시도했다. 결과는 내 쿼리와 동일합니다. 행은 고유하지 않습니다. –