2015-11-18 11 views
9

Si supponga Ho una tabella abbonamenti:Come controllare se il valore esiste in ogni gruppo (dopo il gruppo da)

uid | subscription_type 
------------------------ 
Alex | type1 
Alex | type2 
Alex | type3 
Alex | type4 
Ben | type2 
Ben | type3 
Ben | type4 

E voglio selezionare solo gli utenti che hanno più di 2 abbonamenti, ma mai sottoscritto con il tipo 1

Il risultato previsto è selezionare solo "Ben".

io posso facilmente trovato gli utenti che hanno più di 2 sottoscrive utilizzando:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 

Ma come per controllare se in un gruppo qualche valore non esiste mai?

Grazie per l'aiuto!

+1

'Ma come per controllare se in un gruppo un certo valore non esiste mai' forse avete bisogno di aggiungere una? dove clausola con un 'NOT EXITS (..)'! – wildplasser

+0

Ho provato questo: SELEZIONA uid DA sottoscrive GROUP BY cid, offrire HAVING COUNT (*)> 2 E NON ESISTE ( \t SELEZIONA uid, subscription_type \t DA sottoscrive \t DOVE subscription_type = 'rinnovano') Ma non funziona, restituisce la tabella vuota – Spivakos

+0

È necessario * associare * l'uid nella sottoquery a quella della query principale. Quindi dovrebbe funzionare. Inoltre: dovrebbe essere in una clausola 'WHERE', non in una clausola having. – wildplasser

risposta

10

Prova questa ricerca:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 
    AND max(CASE "subscription_type" WHEN 'type1' THEN 1 ELSE 0 END) = 0 
+0

Lavoro! Grazie ragazzi! – Spivakos

0

creare la tabella di esempio:

CREATE TABLE subscribes 
(
uid NVARCHAR(MAX), 
subscription_type NVARCHAR(MAX) 
) 

Valori Inserire:

INSERT INTO subscribes 
VALUES ('Alex', 'type1'), ('Alex', 'type2'), ('Alex', 'type3'), ('Alex', 'type4'), ('Ben', 'type2'), ('Ben', 'type3'), ('Ben', 'type4') 

SQL Query:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 
AND MAX(CASE subscription_type WHEN 'type1' THEN 1 ELSE 0 END) = 0 

uscita:

====== 
|uid | 
------ 
|Ben | 
====== 
1

Per verificare se qualcosa non esiste, utilizzare NOT EXISTS(...):

SELECT uid 
FROM subscribes su 
WHERE NOT EXISTS (SELECT * 
     FROM subscribes nx 
     WHERE nx.uid = su.uid AND nx.subscription_type = 'type1' 
     ) 
GROUP BY uid HAVING COUNT(*) > 2 
     ; 
Problemi correlati