一个SQL的几种写法

某天在某技术群看见有人发了这样一个图求助,一看就觉得这题考查的是利用sql行转列

我脑海第一时间就想到用oracle的decode函数来写,但又想到题目没有具体说是哪一种数据库~如果用decode的话,在mysql下是完全不一样的用法(也是因为这次我才知道mysql也有decode方法,但跟oracle的完全不一样,其他数据库暂没研究)

所以我就回复写了这样一个sql

初想的SQL¶

select t1.d,t1.c1 ‘胜‘,t2.c2 ‘负‘ from
(select count(result) c1,d from t_result where result = ‘胜‘ group by d) t1
LEFT outer join
(select count(result) c2,d from t_result where result = ‘负‘ group by d) t2
on t1.d = t2.d

这样的写法比较直观,就是先拿“胜”的出来,在拿“负”的出来,最后用日期关联起来

PS:这里的t_result是数据表,d是时间列,result是胜负结果列

后面我细想了一下,这样结果是出来的,但其实效率不高,因为两次select会导致两次表的扫描,因为之前研究过一下oracle,对这些还是比较敏感的,所以后面又改写了一下

(可能后面写的并不是最优,但起码比最初的有进步,性能有所提升,毕竟优化都是一步一步来的)

SELECT d,SUM(CASE WHEN result=‘胜‘ THEN 1
             ELSE 0
             END),
         SUM(CASE WHEN result=‘负‘ THEN 1
             ELSE 0
             END)
FROM t_result
GROUP BY d

这样扫面一次表就可以得出结果了

最后,再附上oralce的decode函数写法

SELECT d,SUM(decode(result,‘胜‘,1,0)),SUM(decode(result,‘负‘,1,0))
FROM t_result
GROUP BY d
时间: 2024-10-11 06:37:23

一个SQL的几种写法的相关文章

CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

Description A thief is running away! We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping from cross

sql sever 的两种写法

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. 在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性: 一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理: 现在通过一个典型的银行转账的例子来说明一下这两个例子的用法 我们先来看看sql存储过程是如何来

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS

sql for xml 另一种写法(采用 tag 与 union all,简洁易懂)

测试环境:sql 08, 08 R2, 2010,  2012, 2014 等 declare @agent table ( AgentID int, Fname varchar(5), SSN varchar(11) ) insert into @agent select 1, 'Vimal', '123-23-4521' union all select 2, 'Jacob', '321-52-4562' union all select 3, 'Tom', '252-52-4563' de

sql 一条记录多个字段 对应另外一个表 取描述的写法

Users表: 订单表: 现在订单表中,创建人和更新人都是对应于Users表的主键UserID,查询订单时,想显示用户名称 1.先给出自己平时的写法 select o.OrderID, isnull((select top 1 UserName from Users where UserID=o.CreatePeople),'') CreatePeople,--创建人 isnull((select top 1 UserName from Users where UserID=o.UpdatePe

[转]深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

深入理解SQL的四种连接-左外连接.右外连接.内连接.全连接 1.内连接(典型的连接运算,使用像 =  或 <> 之类的比较运算符).包括相等连接和自然连接.     内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外连接.外连接可以是左向外连接.右向外连接或完整外部连接.     在 FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT

关于MyBatis的两种写法

刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml文件之后,在MyBatis基本配置文件指定好这个map文件的位置后就直接 User user = (User) session.selectOne("selectUser", "3"); 第二种就是 mapper接口式,叫做面向接口编程. 先定义一个UserMapper

Android点击事件的四种写法

Android点击事件的四种写法 一.Android点击事件的四种写法 1.点击事件的第一种写法 .  写一个内部类.实现点击事件的接口 bt.setOnClickListener(new MyButtonListener()); 2.点击事件的第二种写法,匿名内部类 bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); 3.点击事件的第三种

全面理解Javascript闭包和闭包的几种写法及用途

一.什么是闭包和闭包的几种写法和用法                                                       1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态. 2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 简单的说,Javascript允许使用内部函数---即函数定义和函数表