mysql 列转行,合并字段

222人阅读 评论(0) 收藏 举报
分类:

原文链接

数据表: 

列转行:利用max(case when then)

max---聚合函数 取最大值
(case course when '语文' then score else end---判断
 as 语文---别名作为列名

 

复制代码
SELECT
    `name`,
    MAX(
        CASE 
        WHEN  course='语文' THEN
            score
        END
    ) AS 语文,
    MAX(
        CASE 
        WHEN course='数学' THEN
            score
        END
    ) AS 数学, 
    MAX(
        CASE 
        WHEN course='英语' THEN
            score
        END
    ) AS 英语
FROM
    student
GROUP BY `name`
; 
复制代码

 

合并字段显示:利用group_cancat(course,”:”,”score”)

复制代码
SELECT
    `name`,
    GROUP_CONCAT(course, ":", score) AS 成绩
FROM
    student
GROUP BY
    `name`;
复制代码

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。
比较抽象,难以理解。

通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函

数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。

group_concat函数应该是在内部执行了group by语句,这是我的猜测。

1.测试语句:
SELECT
    GROUP_CONCAT(`name`)
FROM
    student
GROUP BY
    `name`;

结果去查找name中去查找哪些值是一样的,如果相等,就全部列出来,以逗号分割进行列出,如下:

group_concat('name')
 



2.测试:
SELECT
    GROUP_CONCAT(`name`)
FROM
    student
;
结果:
group_concat('name')


上面是否可以证明,group_concat只有与group by语句同时使用才能产生效果? 下面进行了实际测验


3.测试常量对group_concat()的配置影响:
SET @@GROUP_CONCAT_MAX_LEN=4
手册中提到设置的语法是这样的:
SET [SESSION | GLOBAL] group_concat_max_len = val;

两种有什么区别?

SET @@global.GROUP_CONCAT_MAX_LEN=4;
global可以省略,那么就变成了:SET @@GROUP_CONCAT_MAX_LEN=4;


4.使用语句

SELECT
GROUP_CONCAT(`name`)
FROM
student;

结果得到:
group_concat('name')

结论:group_concat()函数需要与group by语句在一起使用,才能得到需要的效果。
原因可以这样理解:group_concat()得到是属于x组的所有成员(函数里面列参数指定需要显示哪些字段)。x组从哪里来?如

果没有group by进行指定,那么根本不知道group_concat()根据哪个分组进行显示出成员。 所以,像上面没有group by子句

的时候,就显示了刘备,关羽,张飞,刘备,关羽,张飞,刘备,关羽,张飞。


实际中什么时候需要用到这个函数?
假如需要查询的结果是这样:左边显示组名,右边想显示该组别下的所有成员信息。用这个函数,就可以省去很多事情了。

另外,假如我这样使用:
SELECT
    `name`,
    GROUP_CONCAT(course, ":", score) AS 成绩
FROM
    student
;
意义不大。
group_concat()指定一个列是最好的情况。如果指定了多个列。
复制代码
SELECT
    `name`,
    GROUP_CONCAT(course, ":", score) AS 成绩
FROM
    student
GROUP BY
    `name`;
复制代码
那么显示结果类似这样:
group_concat(course,":",score)


查看评论

mysql 列转行,合并字段(行转列)

数据表: 列转行:利用max(case when then)合并字段显示:利用graup_cancat(name1,”;”,”name2”)-- SELECT * from 20160413CaiD...
  • u010363836
  • u010363836
  • 2016-04-13 15:01:58
  • 13999

MySql行转列、字段合并、列转行

CREATE TABLE `TEST_TB_GRADE` (  `ID` int(10) NOT NULL AUTO_INCREMENT,  `USER_NAME` varchar(20) DEF...
  • yifanSJ
  • yifanSJ
  • 2017-07-04 00:32:22
  • 507

SQL SERVER单个字段列转行由逗号","分隔

--1:创建一个表来测试 CREATE TABLE Test_table (seqno INT ,field1 NVARCHAR(30)) --2:下面是将表Test_table分别插...
  • u010944388
  • u010944388
  • 2018-02-28 17:39:23
  • 83

MySQL合并查询到的相同字段的值

select concat_ws('',car_brand.name,car_model.name) as name,car_discount.id,car_discount.title  from...
  • nowadaysall
  • nowadaysall
  • 2015-11-06 19:02:11
  • 1995

mysql 列转行的技巧

转载:http://www.cnblogs.com/cenalulu/archive/2012/08/20/2647463.html 感谢分享,很好用。 前言: 由于很多业务表因为历...
  • An342647823
  • An342647823
  • 2016-03-29 18:32:28
  • 2337

mysql中合并两个字段为一个字段显示

MySQL中concat函数 使用方法:  www.2cto.com   CONCAT(str1,str2,…)   返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则...
  • doublefi123
  • doublefi123
  • 2013-06-20 12:02:42
  • 6210

MySQL 重温SQL——行转列,列转行

原文:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 行转列,列转行是我们在开发过程中经常碰到的问题...
  • zhou16333
  • zhou16333
  • 2017-05-14 22:10:33
  • 4190

MySQL列转行统计数据

笔者在开发的过程中遇到了这样的问题。 其中item_id是固定的字典。值是死的。 其中item_id 等于 1,2,3的值是每一个work_quoted_id都需要相乘的。 相当于一份订单人...
  • u013803262
  • u013803262
  • 2017-06-30 14:37:47
  • 344

MySQL的行转列、列转行、连接字符串 concat、concat_ws、group_concat函数用法

MySQL中concat函数 使用方法: CONCAT(str1,str2,…)   返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。 注意: 如...
  • aya19880214
  • aya19880214
  • 2014-11-19 13:47:31
  • 110608

MySQL合并同一个表中的同类型字段到同一列

最近在做考研相关的项目,中途遇到一个sql查询的问题表scope是一个关于考研科目的表,其中包含了考研政治,考研英语,考研数学以及考研专业科这些字段,学校+专业决定考研科目,我要查询得到某个学校某个专...
  • qq_24342739
  • qq_24342739
  • 2017-01-08 00:55:34
  • 1102
    个人资料
    等级:
    访问量: 13万+
    积分: 1308
    排名: 3万+