2012-10-03 25 views
1

OK,我有一個銷售表,看起來像這樣:MySQL或PHP談到行轉換成列動態

Prod_ID | Store_ID | Date_Sold | Num_Sold 

105  | 1010  | 2012-09-21 | 50 
105  | 1011  | 2012-09-22 | 20 
105  | 1012  | 2012-09-22 | 35 
............................................ 
109  | 1010  | 2012-09-21 | 25 
109  | 1011  | 2012-09-23 | 15 
109  | 1012  | 2012-09-23 | 30

我想創建一個類似如下的新表或視圖:

Store_ID | 105 | ... | 109 

1010  | 50 | ... | 25 
1011  | 20 | ... | 15 
1012  | 35 | ... | 30

我不太確定如何完成此操作。我已經看到人們在哪裏硬編碼,但我不想這樣做,因爲我有更多的50個不同的Prod_IDs,他們不斷變化。有沒有辦法對此動態?我將通過PHP在網頁上顯示這些數據,所以也許有更簡單的方法來使用PHP?讓我知道這個解釋是否不清楚。

在此先感謝!

+1

查詢您的數據庫,並只在HTML表格中輸出信息? –

+0

看起來像這是在這裏描述的相同類型的問題:http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns – Thomas

回答

2

在MySQL中,您將需要使用prepared statementPIVOT的數據。由於MySQL沒有一個PIVOT功能,那麼你就需要沿着使用聚合函數與CASE

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when Prod_ID = ''', 
     Prod_ID, 
     ''' then Num_Sold end) AS ''', 
     Prod_ID, '''' 
    ) 
) INTO @sql 
FROM yourtable; 

SET @sql = CONCAT('SELECT store_id, ', @sql, ' 
        FROM yourtable 
        GROUP BY store_id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

如果你有一個著名的列數,那麼你就硬代碼的值與此類似:

select store_id, 
    sum(case when prod_id = 105 then Num_Sold end) as '105', 
    sum(case when prod_id = 109 then Num_Sold end) as '109' 
from yourtable 
group by store_id 

看到SQL Fiddle with Demo

+0

謝謝bluefeet!這正是我想要的。你碰巧知道如何使用這種方法在PHP中打印表格標題?我嘗試了幾種不同的方式,但似乎無法使其正常工作。 – user1504583

+0

@ user1504583表頭是什麼意思? – Taryn

+0

在HTML中,當您創建新表格時,您可以使用標記來標記表格名稱或列名稱。我只需要第一排。通過這種方式,我可以通過點擊任意表頭來使用我的排序腳本,以查看哪個商店購買了最多/最少的任何給定產品 – user1504583

1

所以上面的視圖是第在MySQL中輸出。 PHP允許您根據需要佈置數據並解決您的問題。你會在表格中重複一行(html用於佈局,php用於重複),並在表格中放置通過PHP調用的MySQL語句的輸出。

有很多代碼可以用來設置MySQL連接(PHP),當然也可以佈置表格(HTML)。