Счетчик SQL, где предложение

У меня есть следующий оператор SQL:

 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)

Что мне действительно нужно, так это получить строки, в которых количество позиций больше числа. Что-то типа:

 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

Есть ли способ сделать это в SQL?


person Kris B    schedule 09.08.2010    source источник
comment
Итак, я использую решение Cade Roux ниже, но кто-нибудь знает, почему, когда я меняю HAVING с оператора OR на оператор AND, я получаю нулевые результаты? Если я использую только один оператор SUM(CASE..), я получаю результаты, но если я комбинирую два сработавших оператора, я получаю нулевой результат.   -  person Kris B    schedule 09.08.2010


Ответы (2)


Как насчет этого?:

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
person Cade Roux    schedule 09.08.2010

HAVING — это ключевое слово, которое вы ищете:

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 
person Scott Stafford    schedule 09.08.2010