按比例计算,然后按SQL分组

时间:2012-08-22 22:51:57

标签: mysql

我有一张像

这样的表格
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写入该数字。

2 个答案:

答案 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