2010-12-22 13 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 

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

こんにちは、ありがとうございました。私は解決策を得ました。私は2番目の組合の中でサブクエリを使用します。私はここにコードを貼り付けています。

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つの合計を取る必要があります。最初の合計は、場所に応じて、その後、助成金の合計。上記のクエリに1つ以上の結合があります。この場合、ROLLUPを使用できますか?ごめんなさい。私はpl SQLの多くの経験を持っていない – Remya

+0

何かがコードで詰まっている - 最初のクエリは13列、2番目は14です。 –

答えて

1

それぞれを同じタイプにキャストできますか?

EDIT:あなたは9iの以降を使用している場合:

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

私は、Oracleを使用しますが、私は最初のセットにNULL SQL Serverで最近、この問題に遭遇したので、それはしばらくしていますUNIONクエリの2番目のセットの対応する列の不規則な書式が原因でした。 SQL Serverの答えは、CAST(colFromFirstSet as myDesiredDataType)で、エンジンは2番目のセットから対応する列を使用して何を行うべきかを知っていました。私は、Oracleでの同様の明示的なキャストが、不一致のデータ型エラーに対処できると仮定しています。

+0

私は両方の選択クエリで合計(列)を使用することはできますか? 2番目の選択が要約合計のクエリであるため、いいえの場合は、列の値の合計が必要です。 – Remya

+0

私は彼がTO_CHAR(SUM(COLUMN9))、またはMAX(TO_NUMBER(COLUMN9))を意味すると思います。 (TO_NUMBERの使用は危険ですが)。 –

3

2番目のクエリでnullの代わりにto_char(null)を試してください。また、2つの結果セットが相互に排他的である場合、または重複を気にしない場合は、UNIONの代わりにUNION ALLを使用することをお勧めします(不要な場合は、重複を除去するためにOracleに指示する必要はありません)。

1

私はCOLUMN9が文字データ型だと思います。 SUMはおそらく数値への暗黙の変換を行っていますが、MAXはVARCHAR2として扱います(つまり、 '9'は '10'より大きいでしょう)。

最初にMAX(TO_NUMBER(COLUMN9))にするか、COLUMN9が数値として返されるようにACTY_COLの定義を変更することをお勧めします。

関連する問題