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(少なくとも1つの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 に答える