1

好的,我有一个如下所示的销售表:

产品 ID | Store_ID | 日期_售出 | 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?如果这个解释不清楚,请告诉我。

提前致谢!!

4

2 回答 2

2

在 MySQL 中,您需要对数据使用准备好的语句PIVOT。由于 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

如果您有已知数量的列,那么您将硬编码类似于以下的值:

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

于 2012-10-03T17:40:49.077 回答
1

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

有大量代码用于设置 MySQL 连接 (PHP),当然还有布置表格 (HTML)。

于 2012-10-03T17:52:25.513 回答