2017-10-04 23 views
0

以下のコードを書きましたが、期待通りに動作していますが時間がかかりすぎます。case文の条件が複数ある場合

`SELECT COUNT(SRC.DVC_ID),'AUDIO' AS FEATURE,'PDPN          ' AS COL_NAME, 'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY ' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID AND SRC.PDPN<>TGT.PDPN 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' 
    UNION ALL   
    SELECT COUNT(SRC.DVC_ID),'AUDIO' AS FEATURE,'PSN' AS COL_NAME, 'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY ' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID AND SRC.PSN<>TGT.PSN 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' 
    UNION ALL     
    SELECT COUNT(SRC.DVC_ID),'AUDIO' AS FEATURE,'PTNR_ID' AS COL_NAME, 'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY ' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID AND SRC.PTNR_ID<>TGT.PTNR_ID 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' 
    UNION ALL     
    SELECT COUNT(SRC.DVC_ID),'AUDIO' AS FEATURE,'PTNR_NM' AS COL_NAME, 'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY ' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID AND SRC.PTNR_NM<>TGT.PTNR_NM 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' 
    UNION ALL    
    SELECT COUNT(SRC.DVC_ID),'AUDIO' AS FEATURE,'SEC_PTNR_ID' AS COL_NAME, 'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY ' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID AND SRC.SEC_PTNR_ID<>TGT.SEC_PTNR_ID 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' ` 

私は以下のようにクエリを変更しましたが、出力が間違っています。

SELECT * FROM(
    SELECT COUNT(SRC.DVC_ID)OVER(PARTITION BY COL_NAME) AS DVC_ID_CNT, 
    'TRFC' AS FEATURE, 
    CASE WHEN SRC.PDPN<>TGT.PDPN THEN 'PDPN             ' 
    WHEN SRC.PSN<>TGT.PSN THEN 'PSN             ' 
    WHEN SRC.PTNR_ID<>TGT.PTNR_ID THEN 'PTNR_ID' 
    WHEN SRC.SEC_PTNR_ID<>TGT.SEC_PTNR_ID THEN 'SEC_PTNR_ID' 
    WHEN SRC.SEC_PTNR_ID<>TGT.SEC_PTNR_ID THEN 'SEC_PTNR_ID' ELSE '0' END COL_NAME 
    ,'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY' AS SRC_TABLE,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
    FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
    JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT ON SRC.DVC_ID=TGT.DVC_ID 
    WHERE TGT.CUR_REC_FL='Y' AND SRC.AUDO_STS IN('A','S') AND SRC.AUDO_PROD_ID IS NOT NULL AND UPPER(SRC.DELV_METH)<>'TELEMATICS' 
    AND COL_NAME<>'0' 
    )A GROUP BY 1,2,3,4,5 

お勧めします。 ありがとうございます

答えて

0

このクエリはあまりにも複雑で、COUNT OVERとGROUP BYは必要ありません。単純なCOUNTで十分です。

CASEを使用して複数の値/行を返すことができないため、単一の行が複数のWHENを満たすことができると仮定すると、結果は間違っています。常に最初にに一致します。

テーブル上の単一パスでこれを取得する唯一の方法は、ピボットされて:あなたは再びWITH使用して、これをアンピボット可能性がもちろん

SELECT 
    Count(CASE WHEN SRC.PDPN<>TGT.PDPN    THEN 1 END) AS PDPN, 
    Count(CASE WHEN SRC.PSN<>TGT.PSN     THEN 1 END) AS PSN, 
    Count(CASE WHEN SRC.PTNR_ID<>TGT.PTNR_ID   THEN 1 END) AS PTNR_ID, 
    Count(CASE WHEN SRC.SEC_PTNR_ID<>TGT.SEC_PTNR_ID THEN 1 END) AS SEC_PTNR_ID, 
    'TRFC' AS FEATURE, 
    ,'DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY' AS SRC_TABLE 
    ,'DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT' AS TGT_TABLE 
FROM DP_VEDW_TRM.V_DEVICE_VIEW_SUMMARY SRC 
JOIN DP_VEDW_SRC_MDB_NGN.DVC_SUM_AUDO_VIEW_HIST_PT TGT 
    ON SRC.DVC_ID=TGT.DVC_ID 
WHERE TGT.CUR_REC_FL='Y' 
    AND SRC.AUDO_STS IN('A','S') 
    AND SRC.AUDO_PROD_ID IS NOT NULL 
    AND Upper(SRC.DELV_METH)<>'TELEMATICS' 

WITH cte AS 
(
    previous query plus DISTINCT 
    !!!must add DISTINCT to force the optimizer to materialize the result!!! 
) 
SELECT PDPN, 'PDPN', FEATURE, SRC_TABLE, TGT_TABLE FROM cte 
UNION ALL 
SELECT PSN, 'PSN', FEATURE, SRC_TABLE, TGT_TABLE FROM cte 
UNION ALL 
... 
:-)第一結果と一致するように
関連する問題