2012-08-22 33 views
0

我有一個像計數的比例,然後按MSQL

ID Name 

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

表我想所有以開始所有通過ID與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

嘗試COUNT(DISTINCT ID)??? –

+0

對不起。 COUNT的意思是什麼(DISTINCT ID – Ank

+0

用COUNT(DISTINCT ID)替換查詢中的COUNT(*))如果你試圖獲得A和B的不同ID –

回答

1

這就能做到:

SELECT 
    id, 
    SUM(IF(name LIKE 'A%',1,0))/SUM(IF(name like 'B%',1,0)) 
FROM `table` 
GROUP BY ID 
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,開頭使用一個項目的數量和那些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優勢。所述聚結器可以將NULL在0