这辈子写过的比较有意思的几个sql

递归

with myRecursion as(

select * from recursion where id=1

union all select r.* from myRecursion m,recursion r where m.id=r.pid

)

select * from myRecursion

Ps:union all 不去重求并集

很多地方都用到了递归,比如asp.net mvc里的模型绑定就是递归绑定的,还比如树状菜单

排名

下表是一个销售业绩表,我对销售业绩做一个排名,显示出排名结果

SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank

FROM ranking  a1, ranking  a2

WHERE a1.Sales < a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)

GROUP BY a1.Name, a1.Sales

ORDER BY a1.Sales DESC, a1.Name DESC;

结果:

重点是自己和自己比较,找出a1的Sales小于a2的Sales的数据 或者Name和Sales都相等的数据(a1里的全部数据去对比a2里的每一个数据)

未分组的结果:

SELECT a1.Name, a1.Sales, a2.sales Sales_Rank

FROM ranking  a1, ranking  a2

WHERE a1.Sales < a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)

结果如图,结果一目了然。只要分组count一下就是排名了。

其实还有一个问题就是有并列排名,比如上图中有个并列第3的,第四名就不存在了。

这些都可根据具体的规则用程序去调整,嘻嘻

去重

有时我们会遇到一些表里有些重复的数据,如图:

第一种,去除全部重复的数据除id以外

declare @t1 table(id int,name nchar(10),Text nchar(10))

insert into @t1(Name,Text)(select distinct Name,Text from mydistinct1)

delete from mydistinct1

insert into mydistinct1(name,text)(select name,text from @t1)

Ps:@t 定义一个虚拟表,向虚拟表里插入用distinct去重的数据,清空原表,再把虚拟表里的数据插入到原表。

第二种,去除指定列重复的数据。

delete from mydistinct where id not in(select MIN(id) from mydistinct group by name)

Ps:sql很简单,分组后取分组里一个id,这里取最小的一个,删除除此之外的id

行转列

select 姓名 as 姓名 ,

max(case 课程 when ‘语文‘ then 分数 else 0 end) 语文,

max(case 课程 when ‘数学‘ then 分数 else 0 end) 数学,

max(case 课程 when ‘物理‘ then 分数 else 0 end) 物理

from tb

group by 姓名

结果如图:

Ps:一目了然就不多解释了

For xml path 现实分组后指定列的全部数据

数据表:

For xml path 结果如下:

select * from forxmlpath for XML path(‘‘)

分组结果:

select name,min(text) from forxmlpath group by name

分组后除此分组列,其他列要显示就要使用聚合函数,只能显示结果中的一个或数量或合计

我们可以利用for xml path的特性把全部数据都显示在一列中,并指定显示格式

逗号间隔:

select text+‘,‘ from forxmlpath for xml path(‘‘)

逗号间隔显示分组后非分组列:

select name,(select text+‘,‘ from forxmlpath where a.name=name for XML path(‘‘))

from forxmlpath a group by name

去掉结尾的逗号:

使用 left函数截取

select name,LEFT(text,LEN(text)-1)text

from(select name,(select text+‘,‘ from forxmlpath where a.name=name for XML path(‘‘)) text

from forxmlpath a group by name)t

时间: 2024-08-04 00:54:15

这辈子写过的比较有意思的几个sql的相关文章

自己写一个java.lang.reflect.Proxy代理的实现

前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Proxy类出来,功能和java.lang.reflect.Proxy一样,传入接口.代理内容,生成代理. 抛砖引玉吧,个人觉得自己写一些JDK里面的那些类挺好的,写一遍和看一遍真的是两个不同的概念,写一遍既加深了对于这些类的理解.提升了自己的写代码水平,也可以在写完之后对比一下自己的实现有哪些写得不好

跟我一起写一个chrome扩展程序

在我没有看这本书之前,我都想象不到,原来chrome扩展程序可以这样写,真的非常有意思. 就是用最简单最基础的代码,然后就实现了一些非常有意思的玩意儿. 先看效果图 实际运用要和现实联系在一起,经历和知识的体系不断的关联,才不会忘记 学习的知识如果在现实工作中没有用到,就会淡忘它.经历要达到一定的程度,项目要达到一定的阶段 这个就是一个很简单的例子,当我们输入facebook网站,就会弹出一个弹框,然后我们输入名字,这个网站就会被我们输入的名字所代替. 这个网站换成随便什么网站都是可以的.接下来

将复杂查询写到查询配置文件--SOD框架的SQL-MAP技术简介

引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列.这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了,于是我研究了下,自己也写了一个: WITH cte1 as ( select stu.deptID, D.depName, stu.stuid , stu.stuName, score_sum.AllScore from dbo.Student stu inner join (select stu

转 一篇关于sql server 三种恢复模式的文章,从sql server 的机制上来写的,感觉很不错,转了

简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确保了事务的ACID属性.在SQL Server崩溃时,DBA还可以通过事务日志将数据恢复到指定的时间点.当SQL Server运转良好时,多了解一些事务日志的原理和概念显得并不是那么重要.但是,一旦SQL SERVER发生崩溃时,了解事务日志的原理和概念对于快速做出正确的决策来恢复数据显得尤为重要.

写java代码遇到的一些问题

记录一些做论文实验写代码时遇到的问题. 数据库SQL语句方面: 1.java通过JDBC连接MySql数据库方法 参见:http://hzy3774.iteye.com/blog/1689525 2.出现错误java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). 注意sql语句如果是查询,用executeQuery(),要对表产生修改的话则使用executeUpdate() ja

如何写复杂的SQL

这里需要使用到case when语句,这个就是sql中的if else语句:         select                  a.ins_id,                 b.product_id,                 b.product_name,                 c.cust_id,                 c.cust_name,                 c.cust_sex,                 c.cust_

将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介

引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列.这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了,于是我研究了下,自己也写了一个: WITH cte1 as ( select stu.deptID, D.depName, stu.stuid , stu.stuName, score_sum.AllScore from dbo.Student stu inner join (select stu

大数据不就是写SQL吗?

[原创,转载请注明出处] 应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句: "不就是写SQL吗,要那么久吗" 我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki 贴出来给大家看看,省略了一些敏感的内容.当然内部版言辞也会温和一点,嘻嘻 在哪里写SQL? 这个问题高级点的问法是用哪种SQL引擎? SparkSQL.Hive.Phoenix.Drill.Impala.Presto.Druid.Kylin (这里的SQL引擎是广义的,大家不必钻牛角尖) 我用一

重写 View 的 Touch 方法,实现一个酷炫的九宫格图片

前几天翻看代码库,发现一个之前写过的一个有意思的小玩意,共享给大家?? 废话不多说,上图,先看看效果 photosView.gif 怎么样,是不是还蛮有意思呢? 实现起来非常简单,我们只需要重写几个 View 的 touch 方法 //触摸开始 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{        if ( [[[touches allObjects]lastObject] vie