2017-03-21 7 views
0

Ich bin recht neu in SQL, aber nachdem ich das Internet nach einer Antwort darauf durchsucht habe, kann ich meine COUNT- und EXCEPT-Anweisungen immer noch nicht finden, um auszuwählen, was ich will.sqlite3: COUNT & EXCEPT funktioniert nicht wie erwartet

Meine Datenbank:

sqlite> CREATE TABLE Football(Team TEXT, Player TEXT, Age INTEGER, primary key(Team, Player)); 
sqlite> .separator , 
sqlite> .import databaseTest Football 
sqlite> .headers on 
sqlite> .mode col 
sqlite> SELECT Team, Player, Age FROM Football ORDER BY Team; 
Team  Player  Age  
---------- ---------- ---------- 
Arsenal  Cech  38   
Arsenal  Giroud  29   
Arsenal  Sanchez  28   
Arsenal  Walcott  27   
Chelsea  Costa  29   
Chelsea  Courtois 25   
Chelsea  Hazard  26   
Chelsea  Willian  26   
Liverpool Can   23   
Liverpool Coutinho 24   
Liverpool Wjinaldum 25   
Liverpool Woodburn 17   
Manchester Aguero  29   
Manchester Jesus  19   
Manchester Silva  28   
Manchester Toure  34   
Manchester De Gea  26   
Manchester Felliani 29   
Manchester Rooney  32   
Manchester Schweinste 35   
Tottenham Delle Ali 22   
Tottenham Kane  24   
Tottenham Rose  24   
Tottenham Vertonghen 27 

Was möchte ich tun, ist SELECT die COUNT von Teams, die ein Spieler im Alter von 30 haben nicht so die select-Anweisung sollte 3 (Chelsea, Liverpool sein, Tottenham).

Dies ist die Aussage, die ich versucht habe und funktionieren würde, angenommen:

sqlite> SELECT COUNT(DISTINCT Team) FROM Football 
...> EXCEPT 
...> SELECT COUNT(DISTINCT Team) FROM Football WHERE Age > 30; 
COUNT(DISTINCT Team) 
-------------------- 
6  

Aber wie Sie es wieder sehen ‚6‘. Was mache ich falsch und wie kann ich das richtige Ergebnis bekommen?

Antwort

1

Hier ist ein anderer Weg. Schauen Sie sich das maximale Alter für jedes Team:

SELECT COUNT(*) 
FROM (SELECT Team 
     FROM Football 
     GROUP BY Team 
     HAVING MAX(Age) <= 30 
    ) t; 

Sie auch EXCEPT verwenden können, aber dies erfordert auch eine Unterabfrage. Sie müssen den Satz Betrieb vor tun die Zählung tun:

SELECT COUNT(DISTINCT TEAM) 
FROM (SELECT Team FROM Football 
     EXCEPT 
     SELECT Team FROM Football WHERE Age > 30 
    ) t; 

Streng genommen ist diese Abfrage COUNT(*) anstatt COUNT(DISTINCT) nutzen könnten. Es kann jedoch mühsam sein, sich daran zu erinnern, dass EXCEPT (wie UNION) doppelte Werte entfernt.

+0

Vielen Dank! Das macht mit HAVING viel mehr Sinn. Ich hatte vorher mit Hilfe von HAVING angeschaut, aber bei der Online-Suche konnte ich keine besonders gute Information finden. Danke noch einmal. – JLW

Verwandte Themen