使用sql中的group关键字在单行中检索数据

时间:2016-10-12 21:48:28

标签: mysql sql

我们说我有一个包含列和数据的表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;

4 个答案:

答案 0 :(得分:5)

使用GROUP_CONCAT

SELECT name,
       id,
       GROUP_CONCAT(CONCAT(section1, section2, section3, section4)
                    ORDER BY section1 SEPARATOR ' ')
FROM yourTable
GROUP BY name, id

此答案假定您希望结果集中包含三列,三列为nameid,以及该名称/ ID组的标记的CSV列表({{1}在这种情况下)。

SQLFiddle

(@Luke提供)

答案 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

SQL Fiddle

编辑:根据评论更改了查询。