递归

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

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

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

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  2. 我发起了一个 用 C# 写 的 浏览器 开源项目 HtmlCore

    我之前还发起过一个 项目, 名字也叫 HtmlCore, 见 <我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore>  https://www.cnblo ...

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

    在我没有看这本书之前,我都想象不到,原来chrome扩展程序可以这样写,真的非常有意思. 就是用最简单最基础的代码,然后就实现了一些非常有意思的玩意儿. 先看效果图 实际运用要和现实联系在一起,经历和 ...

  4. 牛逼哄哄的PageHelper分页插件到底是怎么实现的?网友:给我10分钟,给你写一个~

    Hi,各位读者们 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. ...

  5. 如何写复杂的SQL

    经常有人问我那非常复杂的sql是怎么写出来的,我一直不知道该怎么回答.         因为虽然我写这样的sql很顺手,可是我却不知道怎么告诉别人怎么写. 很多人将这个问题归结为天赋,我却不这么看,我 ...

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

    引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列.这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了 ...

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

    简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...

  8. 写java代码遇到的一些问题

    记录一些做论文实验写代码时遇到的问题. 数据库SQL语句方面: 1.java通过JDBC连接MySql数据库方法 参见:http://hzy3774.iteye.com/blog/1689525 2. ...

  9. 大数据不就是写SQL吗?

    应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句: "不就是写SQL吗,要那么久吗" 我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki 贴出来给大家 ...

随机推荐

  1. 53. spring boot系列合集【从零开始学Spring Boot】

    前40章节的spring boot系列已经打包成PDF在csdn进行发布了,如果有需要的可以进行下载. 下载地址:http://download.csdn.net/detail/linxinglian ...

  2. spoj 375 树链剖分模板

    /* 只是一道树链刨分的入门题,作为模板用. */ #include<stdio.h> #include<string.h> #include<iostream> ...

  3. 简单的事件处理类Event

    class Event{ constructor(){ this.handlers=[] } on(type,fn){ //订阅事件 if(!this.handlers[type]){ this.ha ...

  4. A Complete Guide to Usage of ‘usermod’ command– 15 Practical Examples with Screenshots

    https://www.tecmint.com/usermod-command-examples/ -------------------------------------------------- ...

  5. How to Use DHCP Relay over LAN? - DrayTek Corp

    Assuming Vigor2960 has two LAN networks. Network Administrator wants that, when the internal DHCP is ...

  6. Python3基础(二) 基本数据类型

    Python中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建.在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型 ...

  7. Unicode不可见字符的显示

    Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS 不可见字符”/u200b”为 Unicode Character ‘Z ...

  8. HDU 5305 Friends(dfs)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  9. addSubview和insertSubview 区别

     子视图是以栈的方式存放的. 每次addsubview时都是在最后面添加. 每次在addsubview前和addsubview后可以看看[self.view.subViews count]: 你看看你 ...

  10. 专注UI——是alert()打败了你!

    在上家公司.常常在页面上写aler()提示代码.没有认为有什么,好寻常.认为提示就本来应该是这种,可是,当我到了这家公司.在測试的时候,由于測试人员看到了一个aler弹出框.结果我的页面被退回重写,后 ...