sql行转列,列转行的方法

,,  sql行转列,列转行的方法

如题:有一张表EMP,里面有两个字段:名字,成,有三条记录,分别表示语文(名字)70分,数学(名字)80分,英语(名字)58分,请用一条sql查询出这三条记录并以条件显示出来,大于等于80表示优秀,大于等于60表示及格,小于60分表示不及格!要求显示格式如上!

首先我们创建表,添加如题数据!

CREATE TABLE EMP(名字VARCHAR(20),成INT);

插入EMP值(“语”文,70),(“数”学,80),(“英语”,58);

 sql行转列,列转行的方法

根据题目要求,我们需要将这三行的结果做判断,然后以列的形式显示,这其中有一个行转列的操作。


第一种sql写法:


选择马克斯(情况,name='语文”(当chengji>=80,那么“优秀的时候,chengji<80年和chengji>=60然后'及格”,其他的不及格”),其他“结束)语的文,,

MAX(情况,NAME='数学”(当chengji>=80,那么“优秀的时候,chengji<80年和chengji>=60然后'及格”,其他的不及格”),其他“结束),“数学”,

MAX(情况,NAME='英语”(当chengji>=80,那么“优秀的时候,chengji<80年和chengji>=60然后'及格”,其他的不及格”结束)”结束)“英语”,emp

执行结果如下:

 sql行转列,列转行的方法

,备注:上述sql中使用了马克斯(case)这种用法,马克斯这里的主要作用是为了在3次判断中,取到不为空字符串”的标题,语文、数学,英语!


,第二种写法采用group_concat函数也是可以拼接出如图所有要的结果写法如下:


选择group_concat(名称分隔符“|”),从,emp,联盟所有,选择,,

GROUP_CONCAT(当chengji>=80,那么“优秀的时候,chengji<80年和chengji>=60然后'及格”,其他的不及格”结束,分隔符“|”),emp

执行结果如下:

 sql行转列,列转行的方法

这样看,这个结果也还是可以接受,这里采用了group_concat函数,将列的类容连接起来,作为行!不过这样的结果有点生硬的感觉。


补充一点:这里的sql写法我们可以看的出,如果想要通过第一种写法。我们前面必须要知道列的内容如语文、数学,英语,但是第二种我们却不用知道!这里我们想到了一种方法,通过存储过程,将想要的第一种方法的sql拼出来,然后执行这样的话,后面如果我们的表再添加列,或者减少列,也不会报错!

写法如下:

分隔符$ $


使用‘yhtest’$ $


下降过程中如果存在‘yhtest’$ $


创建定义者=案盄“%”程序“yhtest”()

开始设置@sql=零;

,选择GROUP_CONCAT(不同的

,,CONCAT (

,,,时,“马克斯(情况,NAME=', ' \”, emp.name, \”,然后(当chengji>=80,那么”、“\”,“优秀”,“\”,”时,

,,,,chengji<80年和chengji>=60然后”、“\”,“及格”,“\”,“其他”,“\”,“不及格”,\”,结束),其他的\“\”,结束)”、“\”,emp.name \”,

,,)

,

)@sql从emp;

设置@sql=CONCAT (@sql“,选择”,从,emp);

准备从@sql stmt1;

执行stmt1;

释放准备stmt1;

,结束$ $


分隔符;

调用一下:叫yhtest ();

 sql行转列,列转行的方法

插入几条数据!我们假设提前不知道有多少个科目!

插入emp值(“物理”,72年),(“体育”,84年),

 sql行转列,列转行的方法

这里有个问题!由于我们在存储过程中使用了group_concat函数,这个拼接函数最大拼接长度为1024(默认)超过固定长度,截断处理!由数据库参数group_concat_max_len控制!我们可以根据需要认为调整!


group_concat,调整拼接符号group_concat(名字,分离器,' _ ')

group_concat,排序:group_concat(名字顺序的名字,分离器,' _ ')



,

sql行转列,列转行的方法