2013-09-22 42 views
0

我有一列包含從0-9的單個數字。 我需要知道每個數字出現多少次。 即0-4次,1-5次等。mysql count數字出現次數

我有6列計數,所以我不想執行9 * 6查詢,如果可能的話少做。

編輯:

col1 col2 col3 
1  2  1 
2  1  3 
6  3  8 

我需要知道有多少次出現1列1中,多少次在列2和多少次在第3列 這同樣適用於所有的數字。

感謝, 丹尼

+0

你或許應該考慮正常化您的數據,讓你存儲在包含單獨的表你的價值觀:FK標識您的現有記錄,關注(1-6)的列和包含的價值在它之內。 – eggyal

+0

爲計劃和示例增加了信息 –

+0

@eggyal爲什麼你刪除了你的答案? (即NATURAL JOIN的危險:[SQL-Fiddle](http://sqlfiddle.com/#!2/4545d/7)) –

回答

2

假設你有這一套記錄,

╔══════╦══════╦══════╦══════╦══════╦══════╗ 
║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║ 
╠══════╬══════╬══════╬══════╬══════╬══════╣ 
║ 1 ║ 6 ║ 3 ║ 1 ║ 2 ║ 2 ║ 
║ 2 ║ 7 ║ 3 ║ 8 ║ 3 ║ 9 ║ 
║ 3 ║ 8 ║ 3 ║ 8 ║ 8 ║ 9 ║ 
║ 4 ║ 9 ║ 2 ║ 7 ║ 1 ║ 1 ║ 
║ 5 ║ 0 ║ 1 ║ 3 ║ 1 ║ 6 ║ 
╚══════╩══════╩══════╩══════╩══════╩══════╝ 

查詢

SELECT a.val, 
     MAX(CASE WHEN colName = 'col1' THEN TotalCount ELSE 0 END) col1, 
     MAX(CASE WHEN colName = 'col2' THEN TotalCount ELSE 0 END) col2, 
     MAX(CASE WHEN colName = 'col3' THEN TotalCount ELSE 0 END) col3, 
     MAX(CASE WHEN colName = 'col4' THEN TotalCount ELSE 0 END) col4, 
     MAX(CASE WHEN colName = 'col5' THEN TotalCount ELSE 0 END) col5, 
     MAX(CASE WHEN colName = 'col6' THEN TotalCount ELSE 0 END) col6 
FROM 
     (
      SELECT 0 val UNION ALL 
      SELECT 1 UNION ALL 
      SELECT 2 UNION ALL 
      SELECT 3 UNION ALL 
      SELECT 4 UNION ALL 
      SELECT 5 UNION ALL 
      SELECT 6 UNION ALL 
      SELECT 7 UNION ALL 
      SELECT 8 UNION ALL 
      SELECT 9 
     ) a 
     LEFT JOIN 
     (
      SELECT col1 val, COUNT(*) TotalCount, 'col1' colname 
      FROM tableName 
      GROUP BY col1 
      UNION ALL 
      SELECT col2 val, COUNT(*), 'col2' colname 
      FROM tableName 
      GROUP BY col2 
      UNION ALL 
      SELECT col3 val, COUNT(*), 'col3' colname 
      FROM tableName 
      GROUP BY col3 
      UNION ALL 
      SELECT col4 val, COUNT(*), 'col4' colname 
      FROM tableName 
      GROUP BY col4 
      UNION ALL 
      SELECT col5 val, COUNT(*), 'col5' colname 
      FROM tableName 
      GROUP BY col5 
      UNION ALL 
      SELECT col6 val, COUNT(*), 'col6' colname 
      FROM tableName 
      GROUP BY col6 
     ) b ON a.val = b.val 
GROUP By a.val 

輸出

╔═════╦══════╦══════╦══════╦══════╦══════╦══════╗ 
║ VAL ║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║ 
╠═════╬══════╬══════╬══════╬══════╬══════╬══════╣ 
║ 0 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 
║ 1 ║ 1 ║ 0 ║ 1 ║ 1 ║ 2 ║ 1 ║ 
║ 2 ║ 1 ║ 0 ║ 1 ║ 0 ║ 1 ║ 1 ║ 
║ 3 ║ 1 ║ 0 ║ 3 ║ 1 ║ 1 ║ 0 ║ 
║ 4 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ 
║ 5 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ 
║ 6 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 1 ║ 
║ 7 ║ 0 ║ 1 ║ 0 ║ 1 ║ 0 ║ 0 ║ 
║ 8 ║ 0 ║ 1 ║ 0 ║ 2 ║ 1 ║ 0 ║ 
║ 9 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 2 ║ 
╚═════╩══════╩══════╩══════╩══════╩══════╩══════╝ 
+0

工作!你怎麼做得這麼快,超越了我......但它的工作:) –

+0

你可以請解釋這一行:「MAX(CASE WHEN colName ='num1'THEN TotalCount ELSE 0 END)num1,」 –

+1

Mysql does not像任何其他支持它的RDBMS一樣有一個'PIVOT()'函數。所以基本上它需要使用一個聚合函數,例如。 'MAX()',*在這種情況下*。 'CASE'測試用於在子查詢中生成的列的值。 [沒有聚合函數的結果](http://sqlfiddle.com/#!2/fddf7/17)。當結果爲* true *時,列上給出的值是子查詢中的聚合結果,否則爲'0'。所以爲了避免'val'的重複值,我們使用MAX()來聚合記錄。 –