表结构:
CREATE TABLE [dbo].[Exam](
    [S_date] [datetime] NOT NULL,
    [Order_Id] [varchar](50) NOT NULL,
    [Product_Id] [varchar](50) NOT NULL,
    [Amt] [numeric](18, 0) NOT NULL
) ON [PRIMARY]

题目一: 写一条Sql语句查询前出100到199的记录
题目二: 写一条Sql语句删除重复[除时间外的所有字段字段相同]的记录,保留重复记录中时间最大的记录
题目三: 一条Sql语句查出年份,1月,2月,3月....12月的订单总数列表
题目四: 一条sql语句查询出年份,本月销量,上月销量,环比%,去年同期销量,同比%列表

第一题比较简单,前面也讲过,就不赘述。
第二题:
delete from Exam where S_date not in (
    select e2.maxdt from
    ( 
         select Order_Id,Product_Id,Amt,MAX(S_date) as maxdt from Exam 
         group by Order_Id,Product_Id,Amt
    ) as e2
)
第三题:分两次组
select y,sum(c1) as m1,sum(c2) as m2,sum(c3) as m3,sum(c4) as m4,sum(c5) as m5,sum(c6) as m6,
sum(c7) as m7,sum(c8) as m8,sum(c9) as m9,sum(c10) as m10,sum(c11) as m11,sum(c12) as m12
from 
(
select 
  y, 
  case m when 1 then c else 0 end as c1,
  case m when 2 then c else 0 end as c2,
  case m when 3 then c else 0 end as c3,
  case m when 4 then c else 0 end as c4, 
  case m when 5 then c else 0 end as c5,
  case m when 6 then c else 0 end as c6,
  case m when 7 then c else 0 end as c7,
  case m when 8 then c else 0 end as c8,
  case m when 9 then c else 0 end as c9,
  case m when 10 then c else 0 end as c10,
  case m when 11 then c else 0 end as c11,
  case m when 12 then c else 0 end as c12
from 
  (
   select y,m,count(s_date) as c from 
   (
    select datepart(year,convert(DateTime,s_date)) as y,
     datepart(month,convert(DateTime,s_date)) as m ,
     s_date from exam
   )  as T1
   group by T1.y,T1.m 
  )
as T2
) as T3
group by T3.y

第三题:SQL相当复杂,不过只要理清了思路就很容易上手了,这里主要用到了left join on,语句如下:

select y1 年,m1 月,c1 本月销售额,
       c2 上月销售额,
       case when c2 is null or c2=0 then '无穷大' 
       else cast(cast((isnull(c1, 0)-isnull(c2,0))*100/isnull(c2, 0) as decimal(10,2)) as varchar(50))+'%' end as 环比增长 ,
       c3 去年本月销售额,
       case when c3 is null or c3=0 then '无穷大' 
       else cast(cast((isnull(c1, 0)-isnull(c3,0))*100/isnull(c3, 0) as decimal(10,2)) as varchar(50))+'%' end as 同比增长 
from 
(
select y1,m1,c1,c2,c3
from 
(
   select y1,m1,c1,c2 from 
   (
    select y1,m1,sum(Amt) as c1 from 
     (
          select datepart(year,convert(DateTime,s_date)) as y1,
                   datepart(month,convert(DateTime,s_date)) as m1 ,
                  Amt 
         from orders
     )  as T1
     group by T1.y1,T1.m1 
    ) o2

left join
   (
     select y2,m2,sum(Amt) as c2 from 
     (
         select datepart(year,convert(DateTime,s_date)) as y2,
                  datepart(month,convert(DateTime,s_date)) as m2 ,
                  Amt from orders
       )  as T1
       group by T1.y2,T1.m2
     ) o3
   on o2.y1 = o3.y2 and o2.m1 = o3.m2 - 1
  ) as o4 
  left join 
  (
     select y3,m3,sum(Amt) as c3 from 
     (
         select datepart(year,convert(DateTime,s_date)) as y3,
                  datepart(month,convert(DateTime,s_date)) as m3,
                  Amt from orders
      )  as T1
      group by T1.y3,T1.m3
   ) as o5
   on o4.y1 = o5.y3 - 1 and o4.m1 = o5.m3
) as o6

年   月    本月销售额           上月销售额   环比        去年同期   同比

2012 3     230                         420   -45.24%         NULL    无穷大
    2010 4     270                         NULL   无穷大          300      -10.00%
    2011 4     300                         353   -15.01%         420      -28.57%
    2012 4     420                         463   -9.29%           NULL     无穷大
    2011 5     353                         NULL   无穷大          463       -23.76%
    2012 5     463                         NULL   无穷大          NULL     无穷大
    2011 11    492                        240    105.00%        NULL    无穷大
    2011 12    240                        NULL    无穷大          NULL     无穷大

工欲善其事,必先利其器。
转载自:http://www.cnblogs.com/zhangzhu/archive/2012/05/10/2495034.html

几条复杂的SQL语句的更多相关文章

  1. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  2. sql插入多条数据的sql语句

    sql插入多条数据的sql语句 有三种方法:1.InSert Into <表名>(列名)Select <列名>From <源表名>如:INSERT INTO Ton ...

  3. Mybatis 删除多条数据XML SQL语句删除

    Mybatis 删除多条数据XML SQL语句删除 1.删除多条数据SQL写法 <delete id="deleteParamsByIds"> delete from ...

  4. “取出数据表中第10条到第20条记录”的sql语句+selecttop用法

    1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...

  5. “取出数据表中第10条到第20条记录”的sql语句+select top 使用方法

    1.首先.select top使用方法: 參考问题  select top n * from和select * from的差别 select * from table --  取全部数据.返回无序集合 ...

  6. 各数据库查询前N条记录的SQL语句

    sql在不同数据库查询前几条数据 1. ORACLE SELECT * FROM TABLE_NAME WHERE ROWNUM <= N;  HQL: from table_name t or ...

  7. 如何随机从数据库表中抽一条数据的SQL语句

    NewID() 方法返回一个 GUID,如:EE95A489-B721-4E8A-8171-3CA8CB6AD9E4 在 select 表的时候,再增加一列为 NewID() 就可以了. SQL 语句 ...

  8. mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句

    正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 .如下: 表字段和数据: SQL语句: [sql] view plain cop ...

  9. 一条分页的SQL语句

    1.概述 在网页中如果显示的数据太多就会占据过多的页面,而且显示速度也会很慢.为了控制每次在页面上显示数据的数量,就可以利用分页来显示数据. 2.技术要点 在SQL Server中要实现SQL分页,需 ...

随机推荐

  1. 【CentOs】sudo使用

    在使用Linux系统过程中,通常情况下,我们都会使用普通用户进行日常操作,而root用户只有在权限分配及系统设置时才会使用,而root用户的密码也不可能公开.普通用户执行到系统程序时,需要临时提升权限 ...

  2. NYOJ-244 16进制的简单运算 AC 分类: NYOJ 2014-01-17 21:11 195人阅读 评论(0) 收藏

    #include<stdio.h> int main() { long x,y; char op; int t; scanf("%d ", &t); while ...

  3. Winform 打印PDF顺序混乱,获取打印队列

    工作中PDF打印顺序混乱着实让我疼痛了好久,其实决绝方法非常简单,但没有想到这个点子的时候确实让我走了很多弯路 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方 ...

  4. PHP:汉字转拼音类(全拼与首字母)

    [php] <?php class GetPingYing { private $pylist = array( 'a'=>-20319,'ai'=>-20317,'an'=> ...

  5. Git常用命令大全

    查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示command的help git show # 显示某次提交的内容 git show $id gi ...

  6. Codeforces Round #253 (Div. 2) D题

    题目大意是选出一个其他不选,问问最大概率: 刚开始想到DP:F[I][J][0]:表示从 前I个中选出J个的最大值, 然后对于F[I][J][1]=MAX(F[I-1][J][1],F[I-1][J- ...

  7. HDOJ 3183 A Magic Lamp

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. 定位position详解:relative与absolute

    定位标签:position 包含属性:relative(相对) absolute(绝对) 1.position:relative; 如果对一个元素进行相对定位,首先它将出现在它所在的位置上.然后通过设 ...

  9. 测试c语言函数调用性能因素之测试三

    函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1,               调用函数帧指针 ...

  10. Javascript的怪癖

    1.匿名函数在不闭包的情况下this对象为window,而在双匿名闭包的情况下内部匿名函数的this对象为window. 2.在函数中定义变量,在函数外部想使用该变量,如果变量声明时有var,则访问不 ...