2013-07-25 2 views
2

J'ai une base de données SQLite avec le tableau suivant:Syntaxe Sélectionnez dans SQL Query

CREATE TABLE games (name text, date text, winloss int, gameid int, pointsfor int, pointsagainst int); 

Deux dossiers d'échantillons ressembleraient.

Anna A, 7/12/13, 0, 345, 56, 28 
Barley B, 7/12/13, 1, 345, 28, 56 

(équipe de l'orge perdue, et le won de Anna Chaque le jeu a plusieurs joueurs sur chaque équipe.) Je veux créer une requête qui retournera tous les jeux qui ont eu x joueurs sur une équipe et y joueurs sur un autre, plus le résultat cumulatif de ces jeux.

Je sais comment faire cela en utilisant perl et un fichier csv, et je crois que je pourrais utiliser la même méthode avec l'interface dbi. Je veux apprendre comment créer ce rapport en utilisant seulement des requêtes SQL, cependant. Je suis un nouveau venu dans SQL, et je soupçonne que la solution peut impliquer de faire pivoter la table en utilisant CASE WHEN ou JOIN pour créer une nouvelle table; mais je ne vois pas comment le faire.

Cette requête renverra tous les jeux où les joueurs étaient sur la même équipe et a gagné (ou perdu, selon la valeur de winloss):

select gameid,date from games 
where name in ('Anna A', 'Barley B') and winloss=1 
group by gameid 
having count(*)>1; 

Mais je ne sais pas comment généraliser cette interroger pour retourner les jeux avec les joueurs de l'autre équipe.

+0

* tous les jeux qui ont x joueurs sur une équipe et y joueurs sur un autre * comment prévoyez-vous sur la définition de «x» et «y» –

+0

Par requête utilisateur. Je veux savoir combien de parties où le (s) joueur (x) a (ont) gagné (s) contre le (s) joueur (s) y. Donc, tous 'Anna A' et 'Barley B' contre 'Charley C' et 'Danielle D' par exemple. – user2619203

+0

Quelque chose manque, d'où vient le nombre de joueurs? –

Répondre

0

Cela vous donnera toutes les lignes du jeu ou des jeux où A et B ont gagné contre C, D et E.

select * 
from games 
where gameid in  
    (select gameid from games 
     where name in ('Anna A', 'Barley B') and winloss=1 
     group by gameid 
     having count(*) = 2 
    intersect 
    select gameid from games 
     where name in ('Charly C', 'Dave D', 'Ed E') and winloss = 0 
     group by gameid 
     having count(*) = 3) ; 

Alternativement, vous pouvez utiliser:

select * 
from games where gameid in (
    select gameid from games where name = 'Anna A' and winloss = 1 intersect 
    select gameid from games where name = 'Barley B' and winloss = 1 intersect 
    select gameid from games where name = 'Charly C' and winloss = 0 intersect 
    select gameid from games where name = 'Dave D' and winloss = 0  intersect 
    select gameid from games where name = 'Ed E' and winloss = 0 
    ) ; 

selon ce qui vous convient le mieux. Vous pouvez ensuite ajouter sum et group by pour obtenir des résultats cumulatifs.

+0

Je n'avais pas encore appris l'intersection. C'était très utile. – user2619203

0

Quelque chose comme cela pourrait aider:

where name in ('Anna A', 'Barley B') 

changement

where name in (SELECT DISTINCT Player FROM games) 
+0

Pouvez-vous avoir deux wheres dans la même requête? Ou voulez-vous dire remplacer le premier par le second? Cela renvoie juste une liste de tous les jeux, autant que je sache. – user2619203

+0

Non, mon message n'était pas habilement composé. Le SELECT I ajouté est appelé une requête imbriquée. Je remplace vos deux joueurs codés en dur par une liste unique de joueurs dans le jeu de table. Je doute que ce soit la solution finale pour votre problème global. – rheitzman

+0

Ok. Ce que j'ai en tête, c'est "Anna A" et "Barley B" contre "Charlie C" et "Danielle D." Ne pas générer un rapport sur toutes les (nombreuses) combinaisons, mais uniquement sur les combinaisons sélectionnées par l'utilisateur. – user2619203