过滤表列并查看另一列中的数据[关闭]
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 |
对于多个 concern
s 并且您不需要手动编写它们,您必须使用动态 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
【讨论】:
以上是关于过滤表列并查看另一列中的数据[关闭]的主要内容,如果未能解决你的问题,请参考以下文章