`
zzhonghe
  • 浏览: 248181 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL经典模式 - 行转列

    博客分类:
  • DB
阅读更多
不知道读者有没有类似的遭遇,遇到下面这样的设计:

#雇员信息
create table employee (eId int, propName varchar(10), propName varchar(10));

insert into employee values (1, 'firstName','Calvin'),(1,'lastName','Zhou'),(1,'age','25'), (1,'gender','1')
insert into employee values (2, 'firstName','Grace'),(2,'lastName','Lai'),(2,'age','28'), (2,'gender','0')
insert into employee values (3, 'firstName','Morgan'),(3,'age','28');


#雇员考评
create table score (eId int, score int);

insert into score (1,85), (2,60), (3,90), (4,20);


#用一条SQL语句找出考评在 80分以上, 年龄在28岁以下,并且性别是男 的雇员所有信息

遇到这个需求的时候,开发人员一般都要在心里开始访问DBA的家人了,他妈怎么设计的表,干嘛不把employee的属性集中放一行,搞得都没法查

于是,一般的做法:
1.先找一遍score表,查出所有的 score>85的eId,
2.然后再去employee表把这些Id相关的信息都加到内存里面,比较属性名,拼成一个Employee对象,
3.最后再循环这个对象,对age,和gender属性进行过滤


这个过程麻烦的要死,但如果熟练掌握行转列的技巧,那么就是轻而易举一条语句就查出了所有复合要求的Employee对象


这个技巧就是 case when, 配合group by,以及聚合函数 max或者min 使用:

步骤一, case when, 将行拆到列上面来, 没有值的列用Null表示

select
eId,
case propName when 'firstName' then propValue else null end as firstName,
case propName when 'lastName' then propValue else null end as lastName,
case propName when 'age' then propValue else null end as age,
case propName when 'gender' then propValue else null end as gender
from employee;

步骤二:然后对表进行group by,每个eId一个组:

select
eId,
case propName when 'firstName' then propValue else null end as firstName,
case propName when 'lastName' then propValue else null end as lastName,
case propName when 'age' then propValue else null end as age,
case propName when 'gender' then propValue else null end as gender
from employee group by eId;

步骤三: 用max,过滤掉所有的null

select
eId,
max(case propName when 'firstName' then propValue else null end) as firstName,
max(case propName when 'lastName' then propValue else null end) as lastName,
max(case propName when 'age' then propValue else null end) as age,
max(case propName when 'gender' then propValue else null end) as gender
from employee group by eId;




有了上面这个employee的临时表,就好办了,在这个基础上,添加Score条件的过滤:


select
eId,
max(case propName when 'firstName' then propValue else null end) as firstName,
max(case propName when 'lastName' then propValue else null end) as lastName,
max(case propName when 'age' then propValue else null end) as age,
max(case propName when 'gender' then propValue else null end) as gender
from employee
where eId in (select eId from score where score>80)
group by eId;


最后再添加上employee本身条件28岁以下,男

select tmp.* from (..) as tmp where tmp.age<28 and tmp.gender=1




分享到:
评论

相关推荐

    精典的SQL语句。行转列,列转行的语句

    精典的SQL语句,行转列,列转行的语句 本文共分六个部分,分别讨论精典的SQL语句,行转列,列转行的语句,行列转换、取得数据表的所有列名、更改用户密码、判断表的哪些字段不允许为空、找到含有相同字段的表六个...

    SQLServer Transact SQL全集--很实用

    - `SELECT`:用于从数据库中检索数据,是最常用的SQL语句,可以用来获取满足特定条件的行和列。 - `INSERT`:用于向数据库表中插入新的数据行。 - `DELETE`:用于从表中删除符合条件的数据行。 - `UPDATE`:用于...

    Expert SQL Server In-Memory OLTP, 2nd Edition

    4. **行存储与列存储**:内存优化表可以选择行存储或列存储。行存储适合于事务处理,而列存储则在聚合查询和分析任务中表现优异。 5. **非锁定索引**:内存优化表支持非锁定索引,如哈希索引和范围索引,这些索引...

    Sqoop-sqlserver-hdfs.rar

    在导入过程中,Sqoop可以自动检测表结构,将列映射到HDFS文件的字段,并且可以选择不同的导入模式,如完全导入、增量导入或导出数据到Hive、HBase等其他Hadoop组件。通过这种方式,你可以方便地在SQL Server和Hadoop...

    Python库 | sql_metadata-1.10.0-py3-none-any.whl

    在Python的生态系统中,`sql_metadata`库为开发者提供了方便的方式来获取和操作数据库的元数据,例如表结构、列信息、索引和外键等。这在进行数据库迁移、数据分析或构建数据库相关的工具时非常有用。通过这个库,...

    SQL高级实例-模糊查询-分组随机查询-转换

    例如,`LIKE '%abc%'`将找到包含"abc"的所有字符串,而`REGEXP`则支持正则表达式匹配,提供了更复杂的模式匹配功能。在日常工作中,模糊查询常用于搜索用户输入的关键词、处理不完整或拼写错误的数据等场景。 其次...

    gp 行转列测试数据

    压缩包中的`test_json.sql`文件可能包含了用于测试的SQL语句,这些语句可能创建了测试表,插入了数据,并执行了行转列操作。文件可能包括了使用内置`crosstab`函数和自定义函数的示例,以便比较它们在处理JSON格式...

    行转列之SQL SERVER PIVOT与用法详解

    在SQL Server中,"行转列"是一种将数据表中的行数据转换成列数据的技术,这对于数据展现和分析尤其有用,特别是在制作报表时。本文主要介绍如何使用SQL Server的PIVOT功能来实现这一操作。 首先,我们看一个简单的...

    SQL语句解释大全-从数据库表中检索数据行和列

    SQL语句解释大全--从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --...

    SQL Server T-SQL高级查询

    - **LIKE运算符**:用于在WHERE子句中搜索列中的指定模式。 - `%`代表任意数量的字符,`_`代表一个字符,字符集可以用`[...]`表示,如`LIKE 'a[ij]%'`将匹配以a, i或j开头的字符串。 - `LIKE 'a%b'`匹配以a开头并...

    Oracle PLSQL 编程手册(SQL大全)--打印版

    《Oracle PL/SQL编程手册(SQL大全)--打印版》是一份详尽的指南,旨在帮助数据库管理员、开发人员以及IT专业人士深入了解Oracle数据库中的SQL语言及PL/SQL编程技术。本手册覆盖了从基本的SQL命令到复杂的数据库管理...

    SQL反模式.pdf

    ### SQL反模式详解 #### 一、引言 《SQL反模式》这本书旨在帮助数据库开发者和管理者识别并避免常见的SQL编程陷阱。通过一系列具体案例分析,本书深入浅出地讲解了如何避开那些容易忽视但可能导致严重后果的问题。...

    SQL语句教程--教你写好SQL语句

    ### SQL语句教程知识点详解 #### 一、SELECT语句 **定义与作用:** - `SELECT` 是SQL中最常用的语句之一,主要用于从数据库表中检索数据。 - **基本语法**: ```sql SELECT column_name FROM table_name; ``` - ...

    Sqlserver2008--学习笔记(自己总结)

    ### Sqlserver2008 学习笔记精要 #### 第一章 SQL Server 基础 ##### 1. T-SQL 语句基础 - **创建数据库**: 使用 `CREATE DATABASE` 语句来创建一个新的数据库。例如: ```sql CREATE DATABASE 新数据库名; ``...

    SQL知识点之列转行Unpivot函数

    在SQL中,Unpivot函数是一种转换数据模式的工具,它能将数据表中的列转换成行。这个功能在处理多值属性或者需要将结构化的数据重新布局时特别有用。在本篇文章中,我们将深入探讨SQL的Unpivot函数,以及如何使用它来...

    经典sql-java面试题

    本文将深入探讨“经典SQL-Java面试题”这一主题,旨在帮助求职者准备相关的技术面试。 首先,让我们关注SQL部分。SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。面试中常见的SQL题目...

    sql基本练习-详细

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,其功能强大且广泛应用于各种数据库系统,如MySQL、Oracle、SQL Server等。本资料包主要包含四个方面的内容,分别是SQL基本查询操作、多表...

    SQL Server 数据库管理常用的SQL和T-SQL语句

    ### SQL Server 数据库管理常用的SQL和T-SQL语句 #### 一、查询数据库版本信息 **命令:** ```sql SELECT @@VERSION; ``` **解释:** 此命令用于查看当前运行的 SQL Server 的版本信息,包括服务包、补丁级别等。 ...

    Oracle PL/SQL实例精讲--使用表,课后答案

    学生可能需要在这些模式上运行PL/SQL代码,以了解如何在真实场景中应用学到的概念。 在"书内使用表"的标签下,我们可推测本书的重点是教读者如何在PL/SQL程序中声明、操作和管理表格。这可能包括如何创建表格、定义...

    SQL-cheat-sheet.pdf

    ` 表示选择表t中c1列不同(唯一)的行,并且这些行满足特定条件。 - `SELECT c1, c2 FROM t ORDER BY c1 ASC [DESC];` 对结果集按c1列进行升序(ASC)或降序(DESC)排序。 2. 多表查询 - `SELECT c1, c2 FROM t1 ...

Global site tag (gtag.js) - Google Analytics