2010-08-09 11 views
5

je la l'instruction SQL suivante:Count clause SQL where

SELECT  [l.LeagueId] AS LeagueId, [l.LeagueName] AS NAME, [lp.PositionId] 
FROM   (Leagues l INNER JOIN 
        Lineups lp ON l.LeagueId = lp.LeagueId) 
WHERE  (lp.PositionId = 1) OR 
        (lp.PositionId = 3) OR 
        (lp.PositionId = 2) 

Ce que je vraiment besoin est d'obtenir les lignes où le compte de la position est supérieure à un certain nombre. Quelque chose comme:

SELECT  [l.LeagueId] AS LeagueId, [l.LeagueName] AS NAME, [lp.PositionId] 
FROM   (Leagues l INNER JOIN 
        Lineups lp ON l.LeagueId = lp.LeagueId) 
WHERE  Count(lp.PositionId = 1) > 2 OR 
        Count(lp.PositionId = 3) > 6 OR 
        Count(lp.PositionId = 2) > 3 

Y at-il un moyen de le faire en SQL?

+0

Alors, j'utilise la solution de Cade Roux ci-dessous, mais personne ne sait pourquoi, quand Je change le HAVING d'une déclaration OR à ET déclaration, je reçois zéro résultat? Si je n'utilise qu'une instruction SUM (CASE ..), j'obtiens des résultats, mais si je combine deux instructions qui ont fonctionné, je n'ai aucun résultat. –

Répondre

9

Que diriez-vous cette ?:

SELECT  [l.LeagueId] AS LeagueId, [l.LeagueName] AS NAME 
FROM   (Leagues l INNER JOIN 
        Lineups lp ON l.LeagueId = lp.LeagueId) 
GROUP BY [l.LeagueId], [l.LeagueName] 
HAVING  SUM(CASE WHEN lp.PositionId = 1 THEN 1 ELSE 0 END) > 2 OR 
        SUM(CASE WHEN lp.PositionId = 3 THEN 1 ELSE 0 END) > 6 OR 
        SUM(CASE WHEN lp.PositionId = 2 THEN 1 ELSE 0 END) > 3 
7

est tout le mot-clé que vous recherchez:

SELECT  [l.LeagueId] AS LeagueId, [l.LeagueName] AS NAME, [lp.PositionId] 
FROM   (Leagues l INNER JOIN 
        Lineups lp ON l.LeagueId = lp.LeagueId) 
GROUP BY lp.PositionId, l.LeagueName 
HAVING lp.PositionId = 1 AND COUNT(*) > 2 
     OR lp.PositionId = 2 AND COUNT(*) > 3 
     OR lp.PositionId = 3 AND COUNT(*) > 6