过滤表列并查看另一列中的数据[关闭]

Posted

技术标签:

【中文标题】过滤表列并查看另一列中的数据[关闭]【英文标题】:filter table column and view the data in the another column [closed] 【发布时间】:2013-02-12 21:59:04 【问题描述】:

表'acad_concerns'

id  student_name    start_date  end_date    concern         comments

 1  Anne Curtis     2013-02-27  2013-02-28  Academics       this acad.. 
2   benedict grey   2013-02-27  2013-02-28  Academics       also acad..
3   Anne Curtis     2013-02-27  2013-02-28  Accomodation    this is aco
4   benedict grey   2013-02-27  2013-02-28  Accomodation    also accomo

我想这样查看:

    student_name    Accademics   Accomodation   


    Anne Curtis     this acad..  this is accom..
    benedict grey   also acad..  also accom..

【问题讨论】:

分享您的代码,以便我们提供更好的帮助。 你尝试了什么 至少尝试用英语句子以连贯的方式解释你想做什么以及你有什么问题。这通常会导致自动发现解决方案。 好问题? 【参考方案1】:

我无法解释

让我为你解释一下。

您正在寻找转置每个学生的comments 值的concern。不幸的是,mysql 没有数据透视表操作符。

但是,您可以使用CASE 表达式来执行此操作。像这样:

SELECT 
  student_name,
  MAX(CASE WHEN concern = 'Academics'   THEN comments END) AS 'Accademics',
  MAX(CASE WHEN concern = 'Accomodation' THEN comments END) AS 'Accomodation'
FROM acad_concern    
GROUP BY student_name;

SQL Fiddle Demo

这会给你:

|  STUDENT_NAME |  ACCADEMICS | ACCOMODATION |
----------------------------------------------
|   Anne Curtis | this acad.. |  this is aco |
| benedict grey | also acad.. |  also accomo |

对于多个 concerns 并且您不需要手动编写它们,您必须使用动态 SQL 动态执行此操作,如下所示:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(concern = ''',
      concern, ''', comments, NULL)) AS ', '''', concern , '''')
  ) INTO @sql
FROM acad_concern;

SET @sql = CONCAT('SELECT student_name, ', @sql , '
    FROM acad_concern    
    GROUP BY student_name;');

prepare stmt 
FROM @sql;

execute stmt;

Updated SQL Fiddle Demo

【讨论】:

这个还有别的答案吗? @user1528552 - 抱歉,这是我知道的答案。这可能是其他答案,但我不知道这样做的其他方法。 住宿空了怎么办? 只有学术界有数据 感谢您的回答...【参考方案2】:
   SELECT distinct student_name
        (SELECT comments FROM acad_concern where student_name=student.student_name where concern='Accademics') 
    as Accademics,
        (SELECT comments FROM acad_concern where student_name=student.student_name where concern='Accomodation')
     as Accomodation  
        FROM acad_concern student

【讨论】:

以上是关于过滤表列并查看另一列中的数据[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

比较两个列并从同一个表中的另一列获取数据

在另一列中使用一列中的值

获取一列中重复次数最多的项目及其在另一列中的关联值[关闭]

使用 Filter 或 If Else 根据 R 中另一列中的值过滤指标

SQL - 根据另一列中的日期过滤一列的结果

获取 ant.design 表列中另一列的值?