MySQL或PHP动态地将行转换为列

时间:2012-10-03 17:34:09

标签: php mysql pivot

好的,我的销售表看起来像这样:

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_ID并且它们在不断变化。有没有办法动态地这个?我将通过PHP在网页上显示这些数据,所以也许有一种更简单的方法来使用PHP?如果这个解释不清楚,请告诉我。

提前致谢!!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

所以上面的视图是MySQL中的输出。 PHP允许您根据需要布置数据并解决您的问题。你可以在一个表中创建一个重复的行(html用于布局,php用于重复),并在该表中放置通过PHP调用的MySQL语句的输出。

这里有很多代码用于设置MySQL连接(PHP),当然也包括你的表格(HTML)。