2017-10-04 1 views
0

Ich habe unter Code geschrieben, es funktioniert wie erwartet, aber es dauert zu viel Zeit.Mehrere wenn Bedingung in Fall Aussage

`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' ` 

Also habe ich die Abfrage wie folgt geändert, aber die Ausgabe ist falsch.

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 

Bitte vorschlagen. Vielen Dank im Voraus

Antwort

0

Diese Abfrage ist zu kompliziert, keine Notwendigkeit COUNT OVER plus GROUP BY, ein einfaches COUNT ist genug.

Unter der Annahme, dass eine einzelne Zeile mehrere WHENs erfüllen kann, wird das Ergebnis sowieso falsch sein, da ein CASE nicht verwendet werden kann, um mehrere Werte/Zeilen zurückzugeben, ist es immer erste übereinstimmen.

Der einzige Weg, dies in einem einzigen Durchgang über den Tisch zu bekommen ist Schwenk:

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' 

Natürlich können Sie diese wieder mit dem ersten Ergebnis :-)

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 
... 
mit UNPIVOT könnten passen