0

我有一张像

ID Name

1 ABC
1 DEF
1 VVV
1 BBB
1 BCD
2 ZZZ
2 BAA
3 AAA
3 BBB
3 BBC

我想通过 ID 获取以 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 写入该数字。

4

2 回答 2

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 将 NULL 转换为 0。

于 2012-08-22T23:16:04.620 回答
1

这将做到:

SELECT 
    id, 
    SUM(IF(name LIKE 'A%',1,0))/SUM(IF(name like 'B%',1,0)) 
FROM `table` 
GROUP BY ID
于 2012-08-22T23:18:59.877 回答