2016-11-16 3 views
-1

, z.B. Wenn ich zwei Nulldaten in einer Spalte für dieselbe ID erhalte, dann übergebe null.Um einen Datensatz zu erhalten, wenn mehr als ein Datensatz für dieselbe ID existiert, dann wird nur ein Datensatz basierend auf der folgenden Bedingung

ii) Wenn ich 2 gleiche nicht null Daten in einer Spalte für die gleiche ID, dann pass nicht null.

ii) Wenn ich 1 null und 1 nicht null Daten in einer Spalte für die gleiche ID, dann pass nicht null.

ii) Wenn ich zwei verschiedene nicht null Daten in einer Spalte für dieselbe ID bekomme, dann passiere '?'.

Sample data

Bitte die Beispieldaten in dem Bild finden.

Vielen Dank im Voraus.

Ausgabe nach neuen Code erhalten: Result

+1

Hier finden Sie etwas Nützliches auf [fragen] und wie ein [MCVE] zu bauen. Auch, bitte posten Sie Daten als formatierten Text, [nicht Screenshots] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when- Frage-Frage/285557 # 285557) – Aleksej

Antwort

0

Sie können in unter die Beispieldaten wie Bild herauszufinden SQL.If der Spaltendatentyp varchar (char) bitte löschen Sie den TO_CHAR Ausdruck ist, und ersetzen Sie den Tabellennamen TEST_TABLE zu Ihrem Tisch.

WITH TEST_TABLE AS (
SELECT 1056059 AS PRTY_KEY_ID, NULL AS TOT_ASSET_AM, NULL AS TOT_LIABILITIES_AM, NULL AS DBUS_NM, 'Pediatrics' AS BUS_NATURE_DE FROM DUAL 
UNION ALL 
SELECT 1056059 AS PRTY_KEY_ID, 5000 AS TOT_ASSET_AM, '300000' AS TOT_LIABILITIES_AM, NULL AS DBUS_NM, 'Medicine' AS BUS_NATURE_DE FROM DUAL 
) 
SELECT 
    PRTY_KEY_ID, 
    MIN(CASE WHEN TOT_ASSET_AM_CNT > 1 THEN '?' ELSE TO_CHAR(TOT_ASSET_AM) END) AS TOT_ASSET_AM, 
    MIN(CASE WHEN TOT_LIABILITIES_AM_CNT > 1 THEN '?' ELSE TO_CHAR(TOT_LIABILITIES_AM) END) AS TOT_LIABILITIES_AM, 
    MIN(CASE WHEN DBUS_NM_CNT > 1 THEN '?' ELSE TO_CHAR(DBUS_NM) END) AS DBUS_NM, 
    MIN(CASE WHEN BUS_NATURE_DE_CNT > 1 THEN '?' ELSE TO_CHAR(BUS_NATURE_DE) END) AS BUS_NATURE_DE 
FROM (
    SELECT 
     TEST_TABLE.*, 
     COUNT(TOT_ASSET_AM) OVER(PARTITION BY PRTY_KEY_ID) AS TOT_ASSET_AM_CNT, 
     COUNT(TOT_LIABILITIES_AM) OVER(PARTITION BY PRTY_KEY_ID) AS TOT_LIABILITIES_AM_CNT, 
     COUNT(DBUS_NM) OVER(PARTITION BY PRTY_KEY_ID) AS DBUS_NM_CNT, 
     COUNT(BUS_NATURE_DE) OVER(PARTITION BY PRTY_KEY_ID) AS BUS_NATURE_DE_CNT 
    FROM TEST_TABLE 
) 
GROUP BY PRTY_KEY_ID 
+0

Danke..aber Ihre Abfrage ist teilweise korrekt.Für 2 verschiedene nicht Null Wert, ich bekomme '?' Wenn Sie jedoch die Beispieldaten für TOT_LIABILITIES_AM überprüfen, ist einer für null und der andere für dieselbe ID nicht null. also brauche ich das nicht null wert. – sanjay

+0

Ich habe meine Antwort aktualisiert und getestet und die vorherige, beide geben das Ergebnis, das Sie ausgenommen haben, zurück [1056059,5000,300000, NULL ,?]. – Ming

+0

Bitte überprüfen Sie das Bild Ergebnis, ich habe in meiner Frage beigefügt. – sanjay

0

Sie können folgende versuchen:

SELECT (CASE WHEN PRTY_KEY_ID_NN= 0 THEN NULL /* IF BOTH/ALL VALUES ARE NULL */) 
      WHEN PRTY_KEY_ID_NN <> TOTAL_COUNT THEN PRTY_KEY_ID_NN_MX 
      ELSE 
       CASE WHEN TOTAL_COUNT=PRTY_KEY_ID_NN_DIST THEN NULL /* IF BOTH HAVING DIFFERENT NOT NULL VALUE */ 
       CASE WHEN TOTAL_COUNT<>PRTY_KEY_ID_NN_DIST THEN PRTY_KEY_ID_NN_MX 
       END 
     END)PRTY_KEY_ID_VAL, 
     (CASE WHEN TOTAL_ASSET_A_NN= 0 THEN NULL /* IF BOTH/ALL VALUES ARE NULL */) 
      WHEN TOTAL_ASSET_A_NN <> TOTAL_COUNT THEN TOTAL_ASSET_A_MX 
      ELSE 
       CASE WHEN TOTAL_COUNT=TOTAL_ASSET_A_DIST THEN NULL /* IF BOTH HAVING DIFFERENT NOT NULL VALUE */ 
       CASE WHEN TOTAL_COUNT<>TOTAL_ASSET_A_DIST THEN TOTAL_ASSET_A_MX 
       END 
     END)TOTAL_ASSET_VAL, 
     (CASE WHEN DBUS_NUM_NN= 0 THEN NULL /* IF BOTH/ALL VALUES ARE NULL */) 
      WHEN DBUS_NUM_NN <> TOTAL_COUNT THEN DBUS_NUM_MX 
      ELSE 
       CASE WHEN TOTAL_COUNT=DBUS_NUM_DIST THEN NULL /* IF BOTH HAVING DIFFERENT NOT NULL VALUE */ 
       CASE WHEN TOTAL_COUNT<>DBUS_NUM_DIST THEN DBUS_NUM_MX 
       END 
     END)DBUS_NUM_DIST_VAL, 
     (CASE WHEN BUS_NATURE_DE_NN= 0 THEN NULL /* IF BOTH/ALL VALUES ARE NULL */) 
      WHEN BUS_NATURE_DE_NN <> TOTAL_COUNT THEN BUS_NATURE_DE_MX 
      ELSE 
       CASE WHEN TOTAL_COUNT=BUS_NATURE_DE_DIST THEN NULL /* IF BOTH HAVING DIFFERENT NOT NULL VALUE */ 
       CASE WHEN TOTAL_COUNT<>BUS_NATURE_DE_DIST THEN BUS_NATURE_DE_MX 
       END 
     END)BUS_NATURE_DE_VAL 
FROM 
(SELECT COUNT(*)TOTAL_COUNT, 
     SUM(CASE WHEN PRTY_KEY_ID IS NULL THEN 0 ELSE 1 END)PRTY_KEY_ID_NN, 
     SUM(CASE WHEN TOTAL_ASSET_A IS NULL THEN 0 ELSE 1 END)TOTAL_ASSET_A_NN, 
     SUM(CASE WHEN TOTAL_LIAB_A IS NULL THEN 0 ELSE 1 END)TOTAL_LIAB_A_NN, 
     SUM(CASE WHEN DBUS_NUM IS NULL THEN 0 ELSE 1 END)DBUS_NUM_NN, 
     SUM(CASE WHEN BUS_NATURE_DE IS NULL THEN 0 ELSE 1 END)BUS_NATURE_DE_NN, 
     MAX(PRTY_KEY_ID_NN)PRTY_KEY_ID_NN_MX, 
     MAX(TOTAL_ASSET_A)TOTAL_ASSET_A_MX, 
     MAX(TOTAL_LIAB_A)TOTAL_LIAB_A_MX, 
     MAX(DBUS_NUM)DBUS_NUM_MX, 
     MAX(BUS_NATURE_DE)BUS_NATURE_DE_MX, 
     COUNT(DISTINCT PRTY_KEY_ID_NN) PRTY_KEY_ID_NN_DIST, 
     COUNT(DISTINCT TOTAL_ASSET_A)TOTAL_ASSET_A_DIST, 
     COUNT(DISTINCT TOTAL_LIAB_A)TOTAL_LIAB_A_DIST, 
     COUNT(DISTINCT DBUS_NUM)DBUS_NUM_DIST, 
     COUNT(DISTINCT BUS_NATURE_DE)BUS_NATURE_DE_DIST 
FROM YOUR_TABLE) 
Verwandte Themen