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:
的查询
- count desiredShape = "draw"
- count desiredShape = "straight"
- count desiredShape = "fade"
- count lineDirection = "left"
- count lineDirection = "straight"
- count lineDirection = "right"
每个 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
从如下数据开始:
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:
的查询- count desiredShape = "draw"
- count desiredShape = "straight"
- count desiredShape = "fade"
- count lineDirection = "left"
- count lineDirection = "straight"
- count lineDirection = "right"
每个 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