分组后分组合计以及总计SQL语句(稍微整理了一下)

2020-07-04 06:01:33易采站长站整理

  select   区号,sum(呼叫总量)   from    
  (select   substr(bj,1,4)   as   区号,count(*)   as   呼叫总量   from   call  
  group   by   substr(bj,1,4))  
  union   all  
  (select   substr(zj,1,4)   as   区号,count(*)   as   呼叫总量   from   call  
  where   th=950000  
  group   by   substr(zj,1,4))  
  group   by   区号;

这个应该在Oracle中运行

select    
          decode(th,’950000′,substr(zj,1,4),substr(bj,1,4))   as   区号,  
          count(*)   as   呼叫总量    
from    
          call  
group   by  
          decode(th’950000′,substr(zj,1,4),substr(bj,1,4))

decode(条件,值1,翻译值1,值2,翻译值2,…值n,翻译值n,缺省值)

该函数的含义如下:

IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ……
ELSIF 条件=值n THEN
    RETURN(翻译值n)

ELSE
    RETURN(缺省值)
END IF

 

例子8:在SQL Server2005/2008中对记录进行分组,并获得每组前N条记录
假设有一个表,SQL语句如下:
  
CREATE TABLE [dbo].[scan](
    [km] [int] NULL,
    [kh] [int] NULL,
    [cj] [int] NULL
) ON [PRIMARY]

    其中km为科目号、kh为考生号、cj为成绩,现对km和kh进行分组,并获得每组前2条记录(按cj从高到低排序)。基本思想是为每组加一个序号列,再用where取序号小于等于2的。SQL语句如下:
select * from
(
    select a.km,a.kh,cj,row_number() over(partition by a.km order by a.km,a.cj desc) n
    from
        (select km,kh,SUM(cj) cj from scan group by km,kh) a
) b where n<=2  order by km, cj desc

最后得到的结果集如下图所示。

例子9:如何实现分组Group取前N条记录的sql语句
在表A中根据字段B分组、根据字段C排序并查询出每组中的前三条记录,查询结果要求包含所有字段,请问sql语句该怎么写?下面的sql语句虽然可以实现,但由于数据量比较大,耗费时间太长,有没有不通过表联接而直接分组取记录的方法呢?多谢!

相关文章 大家在看