【问题标题】:MySQL or PHP Turning rows into columns dynamicallyMySQL或PHP动态将行变成列
【发布时间】:2012-10-04 01:55:56
【问题描述】:

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

Prod_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?如果这个解释不清楚,请告诉我。

提前致谢!!

【问题讨论】:

标签: php mysql pivot


【解决方案1】:

在 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

【讨论】:

  • 感谢蓝脚!这正是我想要的。你碰巧知道我将如何使用这种方法打印出 PHP 中的表头吗?我尝试了几种不同的方法,但似乎无法使其正常工作。
  • @user1504583 表头是什么意思?
  • 在 HTML 中,当您创建新表时,您使用 标记作为表头或列名。我只需要对面的第一行。这样,我可以通过单击任何表格标题来使用我的排序脚本来查看哪个商店购买的任何给定产品最多/最少
  • @user1504583 我不知道你会如何使用 PHP。
  • 好的,我可以使用测试表进行所有操作,但是当我将其更改为我的真实表时,我得到了错误。它给了我一个警告,说 GROUP_CONCAT() 剪切了 1 行,然后是错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“FROM GROSS_SALES GROUP BY SITE_ID”附近使用正确的语法。您知道为什么会这样吗?我正在使用 MySQL Workbench CE for Windows 版本 5.2.40 修订版 8790
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签