2017-04-07 4 views
0

Ich bin neu in Netezza und muss die Anzahl der IDs zählen, die einen Schlüssel ungleich Null haben. Mein KEY ist ein Transaktionstyp, und ich möchte die Anzahl der IDs zurückgeben, für die eine Transaktion ausgeführt wurde. Grundsätzlich möchte ich eine Zählung aller UIDs, die einen Schlüssel ungleich Null haben.Netezza zählt bedingt einen Datensatz pro ID

Meine Daten:

SRC UID KEY ... 
A 118 3 ... 
A 517 0 ... 
A 517 1 ... 
A 517 4 ... 
B 623 4 ... 
C 972 0 ... 
C 972 0 ... 

Was ich zurückkehren wollen:

SOURCE UIDs UIDs_W_TRANS 
A  2  2 
B  1  1 
C  1  0 

Hier ist mein Code:

SELECT 
    SRC AS SOURCE, 
    COUNT(DISTINCT(UID)) AS UIDs, 
    SUM(CASE WHEN KEY = 0 THEN 0 ELSE 1) AS UIDs_W_TRANS 

FROM 
    DATABASE 

GROUP BY 
    UID, 
    SOURCE 

Was ich immer zurück ist

SOURCE UIDs UIDs_W_TRANS 
A  2  3 
B  1  1 
C  1  0 

Sie können sehen, dass meine Abfrage jeden Nicht-Null-KEY zählt. Ich habe eine Reihe von Variationen der obigen Abfrage ausprobiert, aber nichts hat mich näher gebracht. Wie kann ich nur 1 Nicht-Null-KEY pro UID zählen?

Antwort

0

Ich glaube, Sie suchen für eine bedingte count(distinct):

SELECT SRC AS SOURCE, 
     COUNT(DISTINCT(UID)) AS UIDs, 
     COUNT(DISTINCT CASE WHEN KEY <> 0 THEN UID END) AS UIDs_W_TRANS 
FROM DATABASE 
GROUP BY SOURCE 
+0

Wow, was für eine prägnante Art und Weise, diese zu lösen. In meinen Ergebnissen sieht es so aus, als zähle ich die UIDs ohne Transaktionen. Ich denke, ich möchte 'COUNT (UNTERSCHEIDUNGSFALL WENN SCHLÜSSEL! = 0 DANN UID ENDE) ALS UIDs_W_TRANS'. Kannst du mir auch helfen zu verstehen, warum ich in dieser Aussage keine ELSE-Klausel brauche? – Lenwood

+0

@Lenwood. . . Ja, es sollte "<> 0" statt "= 0" sein. –

Verwandte Themen