MySQL 查询多个条件下的聚合项

MySQL query for aggregating terms over several conditions

从如下数据开始:

clubType   desiredShape   lineDirection
---------------------------------------
driver     straight       left
driver     draw           straight
iron       straight       right
wedge      straight       straight
iron       fade           right
wedge      straight       straight
iron       fade           left
iron       draw           straight

我想编写一个可以 return:

的查询

每个 clubType

所以,我尝试这样做:

SELECT
    clubType,
    (SELECT count(*) FROM shots WHERE desiredShape = "fade") as count_DesiredFade,
    (SELECT count(*) FROM shots WHERE desiredShape = "draw") as count_DesiredDraw,
    (SELECT count(*) FROM shots WHERE desiredShape = "straight") as count_DesiredStraight
    ...
FROM shots
GROUP BY clubType

但这是不对的。不确定如何遍历 clubtype 并汇总其他计数。

我想以这样的方式结束:

clubType   desDraw   desFade   desStraight   lineLeft   lineRight   lineRight
-----------------------------------------------------------------------------
driver     3         2         4             3          2           1
iron       4         1         2             4          2           1
wedge      1         3         2             1          0           2

使用布尔表达式 return 1 (TRUE) 或 0 (FALSE) 或 NULL。将其包装在 SUM() 聚合中,因此您将获得 "count" 布尔表达式为 TRUE 的行。

例如:

SELECT t.clubType
     , SUM(t.desiredShape = 'fade') as count_DesiredFade
     , SUM(t.desiredShape = 'draw') as count_DesiredDraw
     , SUM(t.desiredShape = 'straight') as count_DesiredStraight
     , ...
  FROM shots t
 GROUP BY t.clubType

注意:表达式 t.desired_shape = 'fade' 等同于

  IF(t.desired_shape = 'fade',1,IF(t.desired_shape IS NULL,NULL,0))

或更符合 ANSI

  CASE WHEN t.desired_shape = 'fade' 
         THEN 1
       WHEN t.desired_shape IS NULL
         THEN NULL
       ELSE 0
  END