2010-12-22 8 views
1

개별 직원 세부 사항을 취한 다음 전체 위치 및 총계에 따라 요약 합계를 구하는 쿼리가 있습니다. 첫 번째 선택 문에서 max (column9)를 취해야하지만 노동 조합에서 나는 합계 (column9)를 취할 필요가있다. "데이터 유형 불일치"라는 오류가 발생한다. 되어 다음 쿼리 :plsql에서 동일한 열에 대해 동일한 열의 다른 데이터 유형

SELECT COLUMN1 AS LASTNAME, 
     COLUMN2 AS FIRSTNAME, 
     COLUMN3 AS LOCATION, 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTIVITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     MAX(COLUMN9) AS REG_HRS, 
     MAX(COLUMN10) AS OT_HRS, 
     MAX(COLUMN11) AS TOTAL_HRS, 
     SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE, 
     COLUMN13 AS FULL_LOCATION      
    FROM TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) 
GROUP BY COLUMN1, COLUMN2, COLUMN3, COLUMN13 
    UNION  
    SELECT NULL, 
     NULL, 
     CONCAT(SUBSTR(COLUMN3,3,3),' Total') AS LOCATION, 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTI, 
     VITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     SUM(COLUMN9) AS REG_HRS, 
     SUM(COLUMN10) AS OT_HRS, 
     SUM(COLUMN11) AS TOTAL_HRS, 
     (SUM(COLUMN12)/COUNT(DISTINCT(COLUMN1))) AS PRODUCTIVITY_PERCENTAGE, 
     COLUMN13 AS FULL_LOCATION 
    FROM TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) 
GROUP BY COLUMN3, COLUMN13 

====================================== ===================================

안녕하세요. 모든 답변을 주셔서 대단히 감사합니다. 나는 해결책을 얻었다. 나는 두 번째 노동 조합 내부에서 서브 쿼리를 사용한다. 여기에 코드를 붙여 넣습니다.

SELECT 
    COLUMN1 AS EMPID, 
    COLUMN2 AS FIRSTNAME, 
    COLUMN3 AS LASTNAME, 
     COLUMN4 AS LOCATION, 
     SUM(COLUMN5) AS ACTIVITYNM1, 
     SUM(COLUMN6) AS ACTIVITYNM2, 
     SUM(COLUMN7) AS ACTIVITYNM3, 
     SUM(COLUMN8) AS ACTIVITYNM4, 
     SUM(COLUMN9) AS ACTIVITYNM5, 
     MIN(COLUMN10) AS EVENTDATE, 
     TO_NUMBER(COLUMN11) AS REG_HRS, 
     TO_NUMBER(COLUMN12) AS OT_HRS, 
     TO_NUMBER(COLUMN13) AS TOTAL_HRS, 
     SUM(COLUMN14) AS PRODUCTIVITY_PERCENTAGE 

FROM 
    TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) 
GROUP BY 
    COLUMN1, 
    COLUMN2, 
    COLUMN3, 
    COLUMN4, 
    COLUMN11, 
    COLUMN12, 
    COLUMN13 
UNION 

SELECT 
    NULL AS EMPID, 
    NULL AS LASTNAME, 
    NULL AS FIRSTNAME, 
     SUBSTR(INNER_REC.LOCATION,2,5) AS LOCATION, 
     SUM(INNER_REC.ACTIVITYNM1) AS ACTIVITYNM1, 
     SUM(INNER_REC.ACTIVITYNM2) AS ACTIVITYNM2, 
     SUM(INNER_REC.ACTIVITYNM3) AS ACTIVITYNM3, 
     SUM(INNER_REC.ACTIVITYNM4) AS ACTIVITYNM4, 
     SUM(INNER_REC.ACTIVITYNM5) AS ACTIVITYNM5, 
     MIN(INNER_REC.EVENTDATE) AS EVENTDATE, 
     SUM(INNER_REC.REG_HRS) AS REG_HRS, 
     SUM(INNER_REC.OT_HRS) AS OT_HRS, 
     SUM(INNER_REC.TOTAL_HRS) AS TOTAL_HRS, 
     SUM(INNER_REC.PRODUCTIVITY_PERCENTAGE) AS PRODUCTIVITY_PERCENTAGE 
    FROM 
    (
SELECT 
    COLUMN1 AS EMPID, 
    NULL AS LASTNAME, 
    NULL AS FIRSTNAME, 
     COLUMN4 AS LOCATION, 
     SUM(COLUMN5) AS ACTIVITYNM1, 
     SUM(COLUMN6) AS ACTIVITYNM2, 
     SUM(COLUMN7) AS ACTIVITYNM3, 
     SUM(COLUMN8) AS ACTIVITYNM4, 
     SUM(COLUMN9) AS ACTIVITYNM5, 
     MIN(COLUMN10) AS EVENTDATE, 
     SUM(TO_NUMBER(COLUMN11))/(SELECT COUNT(1) FROM TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) AB WHERE AB.COLUMN4 = 

CD.COLUMN4 AND AB.COLUMN1 = CD.COLUMN1) AS REG_HRS, 
     SUM(TO_NUMBER(COLUMN12))/(SELECT COUNT(1) FROM TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) AB WHERE AB.COLUMN4 = 

CD.COLUMN4 AND AB.COLUMN1 = CD.COLUMN1) AS OT_HRS, 
     SUM(TO_NUMBER(COLUMN13))/(SELECT COUNT(1) FROM TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) AB WHERE AB.COLUMN4 = 

CD.COLUMN4 AND AB.COLUMN1 = CD.COLUMN1) AS TOTAL_HRS, 
     SUM(COLUMN14) AS PRODUCTIVITY_PERCENTAGE  
FROM 
    TABLE(ACTY_COL(V_STARTDATE,V_ENDDATE)) CD 
GROUP BY 
    COLUMN4, 
    COLUMN1 
) INNER_REC 
GROUP BY 
    INNER_REC.LOCATION 
+2

[ROLLUP] (http://www.adp-gmbh.ch/ora/sql/group_by/group_by_rollup.html)을 GROUP BY에 추가하면 UNION을 사용할 필요가 없습니다. –

+0

하지만 총 2 개를 가져 가야합니다. 먼저 총계에 따른 요약 총계와 그 이후 보조금 총계. 위 쿼리에 하나 이상의 조합이 있습니다.이 경우 ROLLUP을 사용할 수 있습니까? 미안 해요. 나는 pl SQL에 많은 경험을 가지고 있지 않다 – Remya

+0

뭔가가 코드에 채워져있다 - 첫 번째 쿼리는 13 열을 가지고, 두 번째는 14가있다. –

답변

1

같은 유형으로 각각 캐스팅 할 수 있습니까?

편집 : 나중에 9i의 이상을 사용하는 경우 : 나는 오라클을 사용하기 때문에

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions016.htm

그것은 오랜만이야,하지만 난 SQL 서버에서 최근이 문제에 실행했던 첫 세트에서 널 (null) UNION 쿼리의 두 번째 집합에서 해당 열의 엉뚱한 서식이 발생했습니다. SQL Server의 대답은 CAST (colFromFirstSet as myDesiredDataType) 였으므로 엔진은 두 번째 집합에서 해당 열을 어떻게 처리해야하는지 알 수있었습니다. Oracle에서 비슷한 명시 적 형변환이 일치하지 않는 데이터 유형 오류를 처리한다고 가정합니다.

+0

말을 의미 내가 선택 쿼리에서 sum (column)을 사용할 수 있습니까? 두 번째 select가 요약 합계에 대한 쿼리이기 때문에 no로 설정하면 열 값의 합이 필요합니다. – Remya

+0

나는 그가 TO_CHAR (SUM (COLUMN9)) 또는 MAX (TO_NUMBER (COLUMN9))를 의미한다고 생각한다. (TO_NUMBER를 사용하면 위험 할 수 있음). –

3

두 번째 쿼리에서 null 대신 to_char (null)를 사용하십시오. 또한 두 결과 집합이 상호 배타적이거나 중복에 대해 신경 쓰지 않으면 UNION 대신 UNION ALL을 사용하는 것이 좋습니다 (필요하지 않은 경우 중복 제거의 추가 단계를 수행 할 필요가 없음).

1

나는 COLUMN9가 문자 데이터 유형이라고 생각하고 있습니다. SUM은 아마도 숫자 값으로의 암시 적 변환을 수행하고있을 것입니다.하지만 MAX는 이것을 VARCHAR2로 취급합니다 (즉, '9'는 '10'보다 큼).

그래서 처음에는 MAX (TO_NUMBER (COLUMN9))를 사용하거나 COLUMN9가 숫자로 반환되도록 ACTY_COL의 정의를 변경하고 싶습니다.

관련 문제