2011-09-19 55 views
2

我的表是這樣的:像「group by」這樣的列?

+----+---------+---------+--------+ 
| id | value_x | created | amount | 
+----+---------+---------+--------+ 

value_x設置六根弦的,可以說「一」,「二」,「三」等 我需要建立這樣的報告:

+--------------+-------------------------+-------------------+----------------------+ 
| day_of_month |   "one"   |  "two"  |   [etc.]  | 
+--------------+-------------------------+-------------------+----------------------+ 
| 01-01-2011 | "sum(amount) where value_x = colum name" for this specific day  | 
+--------------+-------------------------+-------------------+----------------------+ 

最明顯的解決方案是:

SELECT SUM(amount), DATE(created) FROM `table_name` WHERE value_x=$some_variable GROUP BY DATE(created) 

環這個查詢六次,在每次迭代$some_variable另一個價值,但我courious如果有可能在單個查詢中做到這一點?

+1

這是一個可能的重複的這個問題http://stackoverflow.com/questions/4943496/transpose-rows-into-columns-in-mysql –

+0

一個更簡單的解決方案將不是以這種方式存儲您的數據。如果「一」,「二」,「三」等都表示相同的數據,它們應該在同一個字段中。 – JNK

+0

確定的問題不是重複的。這是關於GROUP_CONCAT,這是一個數據透視表。 –

回答

4

你所要求的稱爲「數據透視表」,通常可以實現如下。這個想法是爲每個潛在值value_x你或者產生一個1或0每行,並總結1和0來得到每個值的總和。

SELECT 
    DATE(created), 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'one', 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'two', 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'three', 
    etc... 
FROM table_name 
GROUP BY YEAR(created), MONTH(created), DAY(created) 
+0

+1,但OP是要求總和(金額)。所以它應該是'CASE value_x當'一'那麼總和(金額)作爲一個,當'兩個'那麼總和(金額)爲兩個....' – Johan

+0

@Johan是的,固定的感謝。 –

+0

第一個版本也非常有幫助。謝謝,作品像魅力:) – DzikiMarian

1

這將接近:

SELECT 
    s.day_of_month 
    ,GROUP_CONCAT(CONCAT(s.value_x,':',s.amount) ORDER BY s.value_x ASC) as output 
    FROM (
     SELECT DATE(created) as day_of_month 
       ,value_x 
       ,SUM(amount) as amount 
     FROM table1 
     GROUP BY day_of_month, value_x 
     ) s 
GROUP BY s.day_of_month 

您將需要閱讀的輸出,並查找之前:放置在適當的列中的項目的value_x

這種方法優於@Michael的方法的好處是,您無需事先知道字段value_x的可能值。