我们说我有一个包含列和数据的表tbl_marks,如下所示。
name id section1 section2 section3 section4 year
cherry 1 100 101 102 103 2016
cherry 1 200 201 202 203 2015
cherry 1 300 301 302 303 2014
预期输出格式:
cherry 1 100101102103 200201202203 300301302303
我希望将一年中所有部分的分数连接起来,然后按照空格分隔另一年的分数。 所以我需要单列5列。 (姓名,身份证,第1年分数,第2年分数,第3年分数)
请告诉我如何更新以下查询。谢谢。
查询:选择名称,ID,???来自tbl_marks group by id;
答案 0 :(得分:5)
使用GROUP_CONCAT
:
SELECT name,
id,
GROUP_CONCAT(CONCAT(section1, section2, section3, section4)
ORDER BY section1 SEPARATOR ' ')
FROM yourTable
GROUP BY name, id
此答案假定您希望结果集中包含三列,三列为name
,id
,以及该名称/ ID组的标记的CSV列表({{1}在这种情况下)。
答案 1 :(得分:0)
您正在寻找的流程称为'旋转'并且在基本SQL中不能动态,因为它是一种基于集合的语言。
只需检索业务逻辑代码中的行,然后将其转换为列。
答案 2 :(得分:0)
您需要使用的只是MySQL的group_concat()
和concat()
函数,例如
select name, group_concat(concat(value1, value2))
from table
group by name
以下是 SQL Fiddle 示例。
答案 3 :(得分:0)
解决这个问题的一种方法是自我加入。
SELECT a.id,a.name,CONCAT(a.section1, a.section2, a.section3, a.section4) as val2015
,CONCAT(b.section1, b.section2, b.section3, b.section4) as val2016
,CONCAT(c.section1, c.section2, c.section3, c.section4) as val2017
FROM test a
LEFT JOIN test b
ON b.id=a.id
LEFT JOIN test c
ON c.id=a.id
WHERE a.year=2015 AND b.year=2016 AND c.year=2017
编辑:根据评论更改了查询。