【问题标题】:Row into Column in mysql without pivot and group concat在没有数据透视和分组连接的情况下,在 mysql 中进入列
【发布时间】:2013-09-16 16:45:10
【问题描述】:

我有一张这样的桌子

ID    Student    Exam
----------------------  
1      Kavi      BE       
2      MGR       BA      
3      MGR1      BE  

我正在以 excel 格式编写这些数据。问题是我需要将考试字段按列排列,

BE      BA 
-------------
Kavi    NULL 
NULL    MGR
MGR1    NULL

这只能通过查询来完成,因为我无法修改 excel 类以使其打印按列的数据。

我使用了 group concat,但我需要将考试详细信息放在单独的列中,而不是在同一列中。我不应该使用 pivot,因为少数版本的 mysql 不支持它。 请帮忙。

注意:此表可能有多个记录,因此请提供可以动态工作的解决方案。

【问题讨论】:

    标签: php mysql pivot


    【解决方案1】:

    MySQL 没有 PIVOT 函数,因此您需要使用带有 CASE 表达式的聚合函数来获得结果:

    select
      max(case when exam = 'BE' then student end) BE,
      max(case when exam = 'BA' then student end) BA
    from yourtable
    group by id;
    

    SQL Fiddle with Demo

    如果您将拥有未知数量的 exam 值,那么您将需要考虑使用带有动态 sql 的准备好的语句。代码将类似于:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when exam = ''',
          exam,
          ''' then student end) AS `',
          exam, '`'
        )
      ) INTO @sql
    from yourtable;
    
    SET @sql 
        = CONCAT('SELECT ', @sql, ' 
                  from yourtable
                  group by id;');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle with demo。两个版本都给出了结果:

    |     BE |     BA |
    |   Kavi | (null) |
    | (null) |    MGR |
    |   MGR1 | (null) |
    

    【讨论】:

    • @bluefeet。我不能使用像exam ='BE'或exam ='BA'这样的静态条件,因为可以有许多记录添加到这个表中。你能提供这些条件作为动态一个?
    • @user2743855 看我的编辑,你将不得不使用带有准备好的语句的动态 sql 来执行一个 sql 字符串
    • 在 phpmyadmin 中运行查询时,即使我有显示的记录,它也会给出空记录。你能告诉我原因吗?这是否支持 myadmin?
    • @FreshPrinceOfSO。没有错误。我已附上屏幕截图供您查看。 link
    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 2022-12-03
    • 2020-10-12
    • 2018-11-06
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多