我有一张像
这样的表格ID Name
1 ABC
1 DEF
1 VVV
1 BBB
1 BCD
2 ZZZ
2 BAA
3 AAA
3 BBB
3 BBC
我希望得到以A开头的所有名称与以B开头的所有名称的比率。
所以输出应该是
ID Ratio
1 0.5
2 0
3 0.33
SELECT (ID, (SELECT COUNT(*) FROM `table` WHERE name LIKE 'A%') /
(SELECT COUNT(*) FROM `table` WHERE name LIKE 'B%')) AS `ratio` from table Group by ID
没有给我正确的答案。它将所有ID中A / B的总比率考虑在内,并为所有ID写入该数字。
答案 0 :(得分:3)
我试试:
SELECT ID, CASE WHEN B = 0 THEN 0 ELSE A/B END AS Ratio FROM
( SELECT ID,
SUM(CASE WHEN Name LIKE 'A%' THEN 1 ELSE 0 END) AS A,
SUM(CASE WHEN Name LIKE 'B%' THEN 1 ELSE 0 END) AS B
FROM my_table GROUP BY ID ) AS grouped;
内部SELECT获取组ID,每个ID获取以A开头的项目数和以B开头的项目数。
外部SELECT(如果你确定总会有至少一个B行,你可以省略它)在尝试计算它之前检查该比率是否有意义。
否则:
SELECT ID, COALESCE(SUM(CASE WHEN Name LIKE 'A%' THEN 1 ELSE 0 END)
/ SUM(CASE WHEN Name LIKE 'B%' THEN 1 ELSE 0 END), 0)
FROM my_table GROUP BY ID;
这利用了以下事实:如果B行的数量为零,则除法将产生NULL。 COALESCE在0中转换为NULL。
答案 1 :(得分:1)
这样做:
SELECT
id,
SUM(IF(name LIKE 'A%',1,0))/SUM(IF(name like 'B%',1,0))
FROM `table`
GROUP BY ID