数据人员Sql必会——列转行

今天被问到列转行的问题,竟然没有回答上来,回想自己也是数据开发人员,平时的积累真是不到位,下面总结一下列转行。

假设咱们有一个学生得分数据表:student_score

CREATE TABLE student_scores
(
  user_name character varying(30) NOT NULL, -- 学生名称
  subject character varying(30) NOT NULL, -- 课程名称
  score integer, -- 得分
  CONSTRAINT student_scores_pkey PRIMARY KEY (user_name, subject)
);
COMMENT ON COLUMN student_scores.user_name IS ‘学生名称‘;
COMMENT ON COLUMN student_scores.subject IS ‘课程名称‘;
COMMENT ON COLUMN student_scores.score IS ‘得分‘;

是postgresql的语法,就四个字段,下面是数据库内容:

那么我希望把这些数据用另外的一种方式展现,比如:

那么如何使用sql实现哪?下面我贴出来代码:

第一种办法,逻辑简单 左关联:

SELECT
  a.user_name,
  b.score as "语文",
  c.score as "数学",
  d.score as "英语",
  e.score as "生物"
FROM (select distinct user_name from student_scores) a
left join (select score, user_name FROM student_scores where subject = ‘语文‘) b on b.user_name=a.user_name
left join (select score, user_name FROM student_scores where subject = ‘数学‘) c on c.user_name=a.user_name
left join (select score, user_name FROM student_scores where subject = ‘英语‘) d on d.user_name=a.user_name
left join (select score, user_name FROM student_scores where subject = ‘生物‘) e on e.user_name=a.user_name

第二种方法,必然好了一些:

SELECT
      user_name,
      MAX(CASE subject WHEN ‘语文‘ THEN Score ELSE 0 END) AS "语文",
      MAX(CASE subject WHEN ‘数学‘ THEN Score ELSE 0 END) AS "数学",
      MAX(CASE subject WHEN ‘英语‘ THEN Score ELSE 0 END) AS "英语",
      MAX(CASE subject WHEN ‘生物‘ THEN Score ELSE 0 END) AS "生物"
FROM student_scores
GROUP BY user_name
时间: 2024-10-21 16:38:28

数据人员Sql必会——列转行的相关文章

sql 行专列 列转行 普通行列转换

转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法.  问题:假设有张学生成绩表(tb)如

SQL Server 行转列,列转行

一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + value FROM A WHERE name = Test.name FOR XML PATH('') ), 1, 1, '') ) FROM A AS Test GROUP BY name; PS:STUFF语句就是为了去掉第一个[逗号] 附STUFF用法:(从原字符的第二个开始共三个字符替换为后面的字符)

SQL 行转列查询汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column) F

SQL行、列互转汇总

转自:http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 )

SQL行转列汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column)

sql 行转列总结

原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

PIVOT用于将列值旋转为列名(即行转列) 语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行) 语法: table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 注意:PIVOT.UNPIVOT是SQL Server 2005的语法,使用需修改数

再写行转列和列转行

原始表: 1.列转行就是将一列的数据变成行显示,列转行使用了sum聚合函数,case when判断,列转行需要自己定义别名. 列转行语句: SELECT SUM(CASE WHEN T.LOC = 'NEW YORK' THEN T.DEPTNO END) AS COLUMN_00001, SUM(CASE WHEN T.LOC = 'DALLAS' THEN T.DEPTNO END) AS COLUMN_00002, SUM(CASE WHEN T.LOC = 'CHICAGO' THEN

转 SQL行转列汇总

1.PIVOT 用于将列值旋转为列名(即行转列) PIVOT 的一般语法是:PIVOT(聚合函数(列名) FOR 列名 in (列值1,…) )AS P select * from TB pivot (sum(income) for week in(星期一,星期二,星期三)) t SELECT * FROM tb pivot( MAX(分数) FOR 课程 IN (语文,数学,物理))a 旋转前 姓名       课程       分数 ---------- ---------- -------