2017-10-04 2 views
0

J'ai écrit ci-dessous le code, il fonctionne comme prévu mais il prend trop de temps.Multiple lorsque la condition dans l'instruction 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' ` 

J'ai donc modifié la requête comme ci-dessous, mais la sortie est erronée.

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 

Veuillez suggérer. Merci d'avance

Répondre

0

Cette requête est trop compliquée, pas besoin de COUNT OVER plus GROUP BY, un simple COUNT suffit. En supposant qu'une seule ligne peut satisfaire plusieurs requêtes WHEN, le résultat sera erroné, car un CAS ne peut pas être utilisé pour renvoyer plusieurs valeurs/lignes, c'est toujours le premier match.

La seule façon d'obtenir ce en un seul passage sur la table est pivotante:

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' 

Bien sûr, vous pouvez UNPIVOT cela en utilisant à nouveau avec pour correspondre au 1er résultat :-)

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 
...