2010-08-09 96 views
5

我有以下SQL語句: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) 

我真正需要的是讓行,其中位置的數量比數。類似於:

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中做到這一點?

+0

所以,我用下面凱德魯的解決方案,但沒有人知道爲什麼,當我將HAVING從OR語句更改爲AND語句,我得到零結果?如果我只使用一個SUM(CASE ..)語句,我會得到結果,但是如果將兩個有效的語句組合在一起,我會得到零結果。 – 2010-08-09 15:14:48

回答

9

這個怎麼樣?:

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

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