如何在html中以特定格式显示sql数据

qnakjoqk  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(309)

mysql中的数据格式如下:

name sub
----------------
    a   maths
    a   science
    a   history
    b   maths
    b   science
    a   computer
    a   english
    c   computer
    c   history
    b   history
    c   maths

我计划以html格式显示此数据:

Name    maths   science history computer  english
a          y        y       y       y         y
b          y        y       y       n         n
c          y        n       y       y         n

除了pivot表方法外,如何构造sql查询?

wqlqzqxt

wqlqzqxt1#

可以在sql中使用条件聚合:

SELECT name,  
       MAX(CASE WHEN sub = 'maths'   then 'y' ELSE 'n' END) AS maths,
       MAX(CASE WHEN sub = 'science' then 'y' ELSE 'n' END) AS science,
       MAX(CASE WHEN sub = 'history' then 'y' ELSE 'n' END) AS history,
       MAX(CASE WHEN sub = 'computer'then 'y' ELSE 'n' END) AS computer,
       MAX(CASE WHEN sub = 'english' then 'y' ELSE 'n' END) AS english
FROM table t
GROUP BY name;
tyky79it

tyky79it2#

我在这里发现了一个类似的病例。让我简单介绍一下问题和解决方案:
问题:
转换为:

select * from history;

+--------+----------+-----------+
| hostid | itemname | itemvalue |
+--------+----------+-----------+
|      1 | A        |        10 |
|      1 | B        |         3 |
|      2 | A        |         9 |
|      2 | C        |        40 |
+--------+----------+-----------+

对此:

select * from history_itemvalue_pivot;

+--------+------+------+------+
| hostid | A    | B    | C    |
+--------+------+------+------+
|      1 |   10 |    3 |    0 |
|      2 |    9 |    0 |   40 |
+--------+------+------+------+

解决方案:
根据这篇文章,以下是作者所做的步骤:
选择感兴趣的列,即y值和x值
用额外的列扩展基表——每个x值一列
分组并聚合扩展表——每个y值一个组
(可选)美化聚合表
以下是全文:mysql-从行到列
希望有帮助。
当做,

fnvucqvd

fnvucqvd3#

如果要动态创建列,可以使用动态透视。
使用 GROUP_CONCAT 要创建pivot列,然后使用sql execute语法,请动态执行它。

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'COALESCE(MAX(CASE WHEN sub = ''',
      sub,
      ''' then ''y'' end),''n'') AS ',
      sub
    )
  ) INTO @sql
FROM T;

SET @sql = CONCAT('SELECT name, ', @sql, ' 
                  FROM T 
                  GROUP BY name');

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

sqlfiddle公司
结果

name   maths science history computer    english
    a       y       y       y     y          y
    b       y       y       y     n          n
    c       y       n       y     y          n

相关问题