繁体   English   中英

如何根据 sqlite 中的条件计算不同的值?

[英]How to count distinct values based on condition in sqlite?

我的名为 matchEvent 的表如下所示:

 eventId    playerId  matchId   eventName description
 --------------------------------------------------------
 100        50        1         goal      freeKick
 100        50        1         goal      shot
 200        50        2         foul      penalty
 300        51        3         goal      header
 300        51        3         goal      ownGoal
 400        51        4         goal      ownGoal
 400        51        4         goal      shot

我想计算特定球员在特定比赛中的所有常规进球(但不包括乌龙球)。 我试过了:

con = sqlite3.connect(my_db)
regular_goals = con.execute("SELECT playerId, matchId, COUNT(DISTINCT eventId) FROM matchEvent WHERE eventName = 'goal' GROUP BY playerId, matchId HAVING description <> 'ownGoal'").fetchall()

问题是 HAVING 子句似乎是根据组的顶行值过滤组,所以它给了我:

[(50, 1, 1),(51, 3, 1)]

而我期望的结果是:

[(50, 1, 1)] 

因为我的表只包含一个常规目标。

您需要 2 个级别的聚合:

SELECT playerId, matchId, SUM(counter) total_goals
FROM (
  SELECT playerId, matchId, COUNT(DISTINCT eventId) counter
  FROM matchEvent  
  GROUP BY eventId, playerId, matchId 
  HAVING SUM(eventName = 'goal') > 0 AND SUM(description = 'ownGoal') = 0
) t
GROUP BY playerId, matchId

演示

或者:

SELECT playerId, matchId, COUNT(*) total_goals
FROM (
  SELECT playerId, matchId
  FROM matchEvent  
  GROUP BY eventId, playerId, matchId 
  HAVING SUM(eventName = 'goal') > 0 AND SUM(description = 'ownGoal') = 0
) t
GROUP BY playerId, matchId

演示

或者:

SELECT playerId, matchId, COUNT(DISTINCT eventId) total_goals
FROM matchEvent  
WHERE eventName = 'goal' 
  AND eventId NOT IN (SELECT eventId FROM matchEvent WHERE description = 'ownGoal')
GROUP BY playerId, matchId

演示

结果:

| playerId | matchId | counter |
| -------- | ------- | ------- |
| 50       | 1       | 1       |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM