2017-04-03 30 views
2

我得到了這個SELECT。我想統計(或總計?)玩家的黃色和紅色牌(只在YellowCard = 1時計數黃色牌,而在RedCard = 1時計數紅色牌)。此SELECT無法正常工作。它計數卡,即使有0或NULL ..我如何糾正它?計數值是1

SELECT Firstname, Lastname, COUNT(YellowCard) AS Yellow, COUNT(RedCard) AS Red, Team.Name 
FROM PlayerMatch 
Inner join Player On PlayerMatch.PlayerId = Player.PlayerId 
INNER JOIN Team ON Player.TeamId = Team.TeamId 
INNER JOIN Match ON PlayerMatch.MatchId = Match.MatchId 
WHERE(YellowCard = 1 OR RedCard = 1) 
GROUP BY Lastname, Firstname, Name 
ORDER BY Yellow DESC 

回答

7

使用SUM()代替COUNT()

SELECT Firstname, Lastname, 
     SUM(YellowCard) AS Yellow, SUM(RedCard) AS Red, t.Name 
FROM PlayerMatch pm Inner join 
    Player p 
    On pm.PlayerId = p.PlayerId INNER JOIN 
    Team t 
    ON p.TeamId = t.TeamId INNER JOIN 
    Match m 
    ON pm.MatchId = m.MatchId 
WHERE (YellowCard = 1 OR RedCard = 1) 
GROUP BY Lastname, Firstname, Name 
ORDER BY Yellow DESC; 

這假定的YellowCardRedCard值總是0或1(或NULL)。這似乎是一個合理的假設。

如果不是的話,那麼使用CASE

SELECT Firstname, Lastname, 
     SUM(CASE WHEN YellowCard = 1 THEN 1 ELSE 0 END) AS Yellow, 
     SUM(CASE WHEN RedCard = 1 THEN 1 ELSE 0 END) AS Red, 
     t.Name 
0

你不能這樣做,因爲在SQL將從組&開始where子句,所以你的別名還不存在。

你必須使用SQL子查詢,因爲這教程:http://www.dofactory.com/sql/subquery

如果U嘗試將工作: SELECT * FROM 內蒙古PlayerMatch加入... WHERE黃牌在(SELECT * FROM yourTable WHERE黃牌= 1 ) AND RedCard in(SELECT * FROM yourTable WHERE RedCard = 1)...

2

不,NULL s不算在內。如果YellowCard,RedCard僅取0,1,NULL值:

SELECT Firstname, Lastname, COUNT(nullif(YellowCard,0)) AS Yellow, COUNT(nullif(RedCard,0)) AS Red, Team.Name 
FROM PlayerMatch 
Inner join Player On PlayerMatch.PlayerId = Player.PlayerId 
INNER JOIN Team ON Player.TeamId = Team.TeamId 
INNER JOIN Match ON PlayerMatch.MatchId = Match.MatchId 
WHERE(YellowCard = 1 OR RedCard = 1) 
GROUP BY Lastname, Firstname, Name 
ORDER BY Yellow DESC