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

今天看到了这个文章感觉内容挺多的,就是比较乱,实在不好整理,脚本之家小编就简单整理了一下,希望大家能凑合看吧

分组后分组合计以及总计SQL语句
 
1)想一次性得到分组合计以及总计,sql:

SELECT 分组字段 FROM 表
GROUP BY 分组字段
compute sum(COUNT(*))

2)分组合计1:

SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名

3)分组合计2:

SELECT COUNT(*) FROM (SELECT distinct 分组字段 FROM 表)别名

4)统计分组后的种类数:
 
例子1:分组合计

SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5)

上面的语句已经可以满足要求分组了.假设执行后有3条记录,怎么才能把这个COUNT值求出?

select count(*) from ( SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5) ) t

例子2:[PL/SQL] 如何得到分组后,组中最大日期的纪录

TABLE:A
A        B                C        D
1        2001/01/01                        1        1
1        2001/12/12                        2        2
3        2002/01/01                        3        3
3        2003/12/12                        4        4

按列A分组,请问如何得到每组中时间最大的数据?

1        2001/12/12                        2        2
3        2003/12/12                        4        4

我的笨方法:

SELECT * FROM A WHERE (A,B) IN( SELECT A,MAX(B) FROM A GROUP BY A )

有更好的方法吗?

1,select * from a out
where b = (select max(b) from a in
                         where in.a = out.a)

2,Select * from
(select a, row_number() over (partition by a
order by b desc) rn
from a)
where rn=1

3,Select a, b,c,d from
(select a, b,c,d,row_number() over (partition by a
order by b desc) rn
from a)
where rn=1

4,select A,B,C,D from test

where rowid in
  (
     select rd from
     (
     select rowid rd ,rank() over(partion A order by B desc)rk from test
     ) where rk=1
    
    
  )
  )

例子3:SQL语句分组获取记录的第一条数据的方法
使用Northwind 数据库

首先查询Employees表

查询结果:

city列里面只有5个城市

使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 先进行分组 注:根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

sql语句为:

select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index
from Employees

执行结果图:

可以看到是按照City分组,EmployeeID排序。

select出分组中的第一条记录

执行语句:

select * from
(select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index
from Employees) a where a.new_index=1

执行结果图:

例子4:sql 获取分组结果后,如何每一组的第一条记录
Eric   red   20
eric   blue  30
andy red   10
andy  blue  5

例如,只获取黑体的记录。

1,declare @fTable table (fName varchar(10), fColor varchar(10), fOrder int)
 
insert into @fTable values('Eric', 'red', 20)
insert into @fTable values('eric', 'blue', 30)
insert into @fTable values('andy', 'red', 10)
insert into @fTable values('andy', 'blue', 5)
 
-- 只获取红色
select * from @fTable where fColor = 'red'
-- 每个 fColor 取一条记录(按 fOrder 正序)
select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder )
-- 每个 fColor 取一条记录(按 fOrder 反序)
select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder desc)
 
2,SQL2005以上版本
select * from (select *,row=row_number()over(partition by Color order by Color) from table1)t where row=1 and color='xx'--加上條件

SQL2000用 top 1

例子5:一条SQL语句搞定分组并且每组限定记录集的数量
 
如果我想得到这样一个结果集:分组,并且每组限定记录集的数量,用一条SQL语句能办到吗?

比如说,我想找出学生期末考试中,每科的前3名,只用一条SQL语句,该怎么写?

表[TScore]的结构

code      学号 char
subject  科目 int
score     成绩 int

可以这样写:

SELECT [code]
        ,[subject]
        ,[score]
    FROM (
        SELECT *
        ,RANK() OVER(PARTITION BY subject ORDER BY score DESC) AS Row
        FROM TScore
    ) AS a
    WHERE Row <= 3 ;

例子6:SQL获取每个分组的第一条记录

SQL查询以下伪数据获取粗体字行的记录
ID,Name,ItemID,Price,CreatedOn
1 a 1 10.00 xxx1
2 a 1 12.00 xxx2
3 b 1 9.00 xxx1
4 b 1 11.50 xxx2
5 c 1 20.00 xxx1
6 a 2 21.00 xxx1
7 a 2 23.00 xxx2
8 b 2 35.00 xxx1
9 c 2 31.00 xxx1
10 c 2 30.50 xxx2
 
获取每个分组中的第一条记录,当ItemID有多条记录时,选取Price最高的
 
--sql2000
select *
from tbname k
where not exists(select * from tbname where
 name=k.name and ITemID=K.ITemID and k.price<price
)
--sql2005
select ID,Name,ItemID,Price,CreatedOnfrom (select *,rn=ROW_NUMBER()over(PARTITION by name,ITemID order by price desc) from tb ) kwhere k.rn=1

例子7:分组后取第一条记录的SQL语句
分享

有如下表结构:  
  字段      A,       B,       C  
  值为      a1,     b1,     c1  
            a2,     b2,     c2  
            a2,     b3,     c3  
            a3,     b4,     c4  
            a3,     b5,     c5

想要得到的结果集以A字段为分组条件,并取出每一个分组中的第一条记录,如下:  
            A,       B,       C  
  值为      a1,     b1,     c1       --a1分组的第一条记录。  
            a2,     b2,     c2       --a2分组的第一条记录。  
            a3,     b4,     c4       --a3分组的第一条记录。

select   *   from   表   tem   where   c=(select   top   1   c   from   表   where   a=tem.a)

现有数据表call如下:  
   
  zj                               th                   bj  
  -------------   --------   -------------  
  03106666666 00001 03101111111  
  13711111111 00001 031122222222  
  03108898888 950000  
  031177778777 950000  
  031155955555 00001 031187888876  
   
  注:th如为950000,则bj为空,th如为00001,则bj不是空。  
   
  1、bj分组  
  select   substr(bj,1,4)   as   区号,count(*)   as   呼叫总量   from   call  
  group   by   substr(bj,1,4);  
  执行结果  
   
  区号                         呼叫总量  
  ------------     --------------  
  0310                           1  
  0311                           2  
                                    2              
   
  2、zj分组,条件是th为950000的记录  
  select   substr(zj,1,4)   as   区号,count(*)   as   呼叫总量   from   call  
  where   th=950000  
  group   by   substr(zj,1,4);  
  执行结果:  
   
  区号                         呼叫总量  
  ------------     --------------  
  0310                           1  
  0311                           1  
   
  能否有一个语句就能实现如下结果:  
   
  区号                         呼叫总量  
  ------------     --------------  
  0310                           2  
  0311                           3  
   
  注:想要得到结果是1对应的行加2对应的行。

union起来再求和  
  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语句虽然可以实现,但由于数据量比较大,耗费时间太长,有没有不通过表联接而直接分组取记录的方法呢?多谢!
select *
from 表A as t1
where 主键 in(
select top 3 主键
from 表A as t2
where t1.B=t2.B
order by t2.C)

注释  (隐藏注释)
答案1
作者:邹建

select id=identity(int,1,1),b, 主键 into # from 表A order by B,C

select a.*
from 表A a, # b,(select id1=min(id),id2=min(id)+2 from # group by b)c
where a.主键=b.主键
and b.id between c.id1 and c.id2

drop table #

答案2
作者:aierong

求每组前2名,你有几种方法?(MS SQL2000)

create table abc(
i nvarchar(10),
ii int,
iii int,
iiii int,
price money)
Go
insert into abc
select 'b',1,2,1,11
union all
select 'b',211,2,1,211
union all
select 'a',21,2,1,311
union all
select 'd',41,42,1,411
union all
select 'd',41,42,1,511
union all
select 'd',41,42,1,611
union all
select 'e',1,2,1,11
union all
select 'e',71,2,1,31
union all
select 'e',61,2,1,911
union all
select 'e',771,2,1,1
go

要求的结果是:
以i分组,求每组price最大的前2条记录

i ii iii iiii price
---------- ----------- ----------- ----------- ---------------------
a 21 2 1 311.0000
b 1 2 1 11.0000
b 211 2 1 211.0000
d 41 42 1 511.0000
d 41 42 1 611.0000
e 71 2 1 31.0000
e 61 2 1 911.0000

1.
select *
from abc a
where (
select counthttp://dev1.haocang.com:8080/kb/images/icons/emoticons/star_yellow.gif from abc b
where a.i=b.i and b.price>a.price)<2
order by i,price

连接查询,判断数量

2.
select i,ii,iii,iiii,price
from (
select (select isnull(sum(1),0)+1 from abc b where a.i=b.i and a.price<b.price) ids,*
from abc a) tem
where ids<3
order by i,price

生产一个内部表,给内部表tem中的每一组排序,并把排序号放入新列ids中

3.
declare @looptime int
declare @count int
declare @i nvarchar(10)
/定义表变量@abc,和表ABC中的所有列类型相同/
declare @abc table(
i nvarchar(10),
ii int,
iii int,
iiii int,
price money)
declare @tem table(
ids int identity,
class nvarchar(10))
/把表ABC中的所有组全部查询出来,暂时存在表变量@tem中/
insert into @tem(class)
select i
from abc
group by i
/求出表变量@tem中行数量/
select @count=@@rowcount
/循环变量@looptime赋初值=1/
select @looptime=1
while(@looptime<=@count)
begin
/将每组名赋值到变量@i/
select @i=class
from @tem
where ids=@looptime
/将每组前2名插入到表变量@abc中/
insert into @abc
select top 2 *
from abc
where i=@i
order by price desc
/循环变量@looptime累加1/
select @looptime=@looptime+1
end
/显示结果/
select *
from @abc
order by i,price

4.
用游标来处理
方法和我的第3种方法类似,大家可以自己试试

我共写了4种,不知道大家还有什么其他好方法,可以交流,谢谢。

今天用到了,利用此方法可以解决一个删除重复记录的问题

当然表必须带有唯一索引,仔细看以下代码

Delete From dbo.TB_WorkflowTask a
 WHERE  ItemID Not in( select top 1 ItemID from TB_WorkflowTask where TaskName=a.TaskName And EmpID = a.EmpID And BillTypeID =a.BillTypeID And BillID = a.BillID And Status =a.Status AND WFStatus =a.WFStatus )

注意:只能用 In 或 Not in ,不能用Exists 或 Not Exists ,至于为什么,大家思考一下?

例子10:如何取得分组后最后一条记录的值?

还是很混乱,再排一下:

重新整理一下格式:

现有一表 Log: Day In Out Current
  2012.4.5 10 0 10
  2012.4.5 0 5 5
  2012.4.6 30 20 15
  2012.4.6 0 3 12

………………………………………………

希望显示为

  2012.4.5 10 5 5
  2012.4.6 30 23 12

SQL code
with tb as(
select [day],sum([in]) as [in],sum(out) as out,sum([in])-sum(out) as [current],rank() over( order by [day]) as row from [log] group by [day]
)
select [day],[in],out,(select sum([current]) from tb b where b.row<=a.row)[current] from tb a
 
 
SQL code
2012.4.5    10    5    5
2012.4.6    30    23    12
 
SQL code
 
--> 测试数据:[Log]
if object_id('[Log]') is not null drop table [Log]
create table [Log]([Day] date,[In] int,[Out] int,[Current] int)
insert [Log]
select '2012.4.5',10,0,10 union all
select '2012.4.5',0,5,5 union all
select '2012.4.6',30,20,15 union all
select '2012.4.6',0,3,12
 
select
[Day],sum([In]) [In],sum([Out]) [Out],min([Current]) as [Current]
from [Log] group by [Day]
 
/*
Day    In    Out    Current
2012-04-05    10    5    5
2012-04-06    30    23    12
*/
 
例子11:sql分组后二次汇总
http://www.jb51.net/article/106074.htm

例子12:sql的分类与分组统计
您需要了解如何使用某些SQL子句和运算符来安排SQL数据,从而对它进行高效分析。下面这些建议告诉您如何建立语句,获得您希望的结果。
以 有意义的方式安排数据可能是一种挑战。有时您只需进行简单分类。通常您必须进行更多处理——进行分组以利于分析与总计。可喜的是,SQL提供了大量用于分 类、分组和总计的子句及运算符。下面的建议将有助于您了解何时进行分类、何时分组、何时及如何进行总计。欲了解每个子句和运算符的详细信息,请查看

#1:分类排序
通常,我们确实需要对所有数据进行排序。SQL的ORDER BY子句将数据按字母或数字顺序进行排列。因此,同类数据明显分类到各个组中。然而,这些组只是分类的结果,它们并不是真正的组。ORDER BY显示每一个记录,而一个组可能代表多个记录。
#2:减少组中的相似数据
分类与分组的最大不同在于:分类数据显示(任何限定标准内的)所有记录,而分组数据不显示这些记录。GROUP BY子句减少一个记录中的相似数据。例如,GROUP BY能够从重复那些值的源文件中返回一个唯一的邮政编码列表:
SELECT ZIP
FROM Customers
GROUP BY ZIP
仅包括那些在GROUP BY和SELECT列列表中字义组的列。换句话说,SELECT列表必须与GROUP列表相匹配。只有一种情况例外:SELECT列表能够包含聚合函数。(而GROUP BY不支持聚合函数。)
记住,GROUP BY不会对作为结果产生的组分类。要对组按字母或数字顺序排序,增加一个ORDER BY子句(#1)。另外,在GROUP BY子句中您不能引用一个有别名的域。组列必须在根本数据中,但它们不必出现在结果中。
#3:分组前限定数据
您可以增加一个WHERE子句限定由GROUP BY分组的数据。例如,下面的语句仅返回肯塔基地区顾客的邮政编码列表。
SELECT ZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ZIP
在GROUP BY子句求数据的值之前,WHERE对数据进行过滤,记住这一点很重要。
和GROUP BY一样,WHERE不支持聚合函数。
#4:返回所有组
当 您用WHERE过滤数据时,得到的组只显示那些您指定的记录。符合组定义但不满足子句条件的数据将不会出现在组中。不管WHERE条件如何,如果您想包括 所有数据,增加一个ALL子句。例如,在前面的语句中增加一个ALL子句会返回所有邮政编码组,而不仅仅是肯塔基地区的组。
SELECT ZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ALL ZIP
照这个样子,这两个子句会造成冲突,您可能不会以这种方式使用ALL子句。当您用聚合求一个列的值时,应用ALL子句很方便。例如,下面的语句计算每个肯塔基邮政编码的顾客数目,同时显示其它邮政编码值。
SELECT ZIP, Count(ZIP) AS KYCustomersByZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ALL ZIP
得到的组由根本数据中的所有邮政编码值构成。但是,聚合列(KYCustomerByZIP)显示为0,因为除肯塔基邮政编码组外没有别的组。
远程查询不支持GROUP BY ALL。
#5:分组后限定数据
WHERE 子句(#3)在GROUP BY子句之前求数据的值。当您希望在分组以后限定数据时,使用HAVING。通常,不管您使用WHERE还是HAVING,得到的结果相同。但要记住,这 两个子句不能互换,这点很重要。如果您存在疑问,这里有一条应用指南:过滤记录时使用WHERE;过滤组时使用HAVING。
一般,您会用HAVING,利用聚合来求一个组的值。例如,下面的语句返回一个邮政编码列表,但这个表内可能不包含根本数据源中的每个邮政编码:
SELECT ZIP, Count(ZIP) AS CustomersByZIP
FROM Customers
GROUP BY ZIP
HAVING Count(ZIP) = 1
仅仅那些只有一名顾客的组出现在结果中。
#6:详细了解WHERE和HAVING
如果您仍然对WHERE和HAVING的用法感到迷惑,应用下面的指导方法:
WHERE出现在GROUP BY之前;SQL在它分组记录前求WHERE子句的值。
HAVING出现在GROUP BY之后;SQL在它分组记录后求HAVING子句的值。
#7:用聚合总计分组值
分组数据有助于对数据进行分析,但有时您还需要组本身以外的其它信息。您可以增加一个聚合函数来总计分组数据。例如,下面的语句为每次排序显示一个小计:
SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY OrderID
与其它的组一样,SELECT和GROUP BY列表必须相匹配。在SELECT子句中包含一个聚合是这一规则的唯一例外。
#8:总计聚合
您可以通过显示每个组的小计进一步总计数据。SQL的ROLLUP运算符为每个组显示一个额外的记录,一个小计。那个记录是用聚合函数在每个组中求所有记录的值的结果。下面的语句为每个组合计OrderTotal列。
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH ROLLUP
一个包含20和25这两个OrderTotal值的组的ROLLUP行将显示OrderTotal值45。ROLLUP结果的第一个值是唯一的,因为它求所有组记录的值。那个值是整个记录集的总和。
ROLLUP不支持聚合函数中的DISTINCT或GROUP BY ALL子句。
#9:总计每一列
CUBE运算符比ROLLUP更进一步,它返回每个组中每个值的总数。得到的结果与ROLLUP相似,但CUBE包括组中每一列的一个额外记录。下面的语句显示每个组的小计和每名顾客的一个额外总数。
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH CUBE
用CUBE得到的总计最为复杂。不仅完成聚合与ROLLUP的工作,而且还求定义组的其它列的值。也就是说,CUBE总计每一个可能的列组合。
CUBE不支持GROUP BY ALL。
#10:给总计排序
当CUBE的结果杂乱无章时(一般都是这样),可以增加一个GROUPING函数,如下所示:
SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH CUBE
其结果包括每一行的两个额外的值。
值1表明左边的值是一个总计值——ROLLUP或CUBE的运算符的结果。
值0表明左边的值是一个原始GROUP BY子句产生的详细记录。

在分组查询中还可以配合使用HAVING子句,定义查询条件。

使用group by进行分组查询

在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:

〉被分组的列
〉为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

group by实例

实例一

数据表:

姓名 科目 分数
张三 语文 80
张三 数学 98
张三 英语 65
李四 语文 70
李四 数学 80
李四 英语 90

期望查询结果:

姓名 语文 数学 英语
张三 80 98 65
李四 70 80 90

代码
 
create table testScore   
(   
   tid int primary key identity(1,1),   
   tname varchar(30) null,   
   ttype varchar(10) null,   
   tscor int null  
)   
go

---插入数据   
insert into testScore values ('张三','语文',80)   
insert into testScore values ('张三','数学',98)   
insert into testScore values ('张三','英语',65)   
insert into testScore values ('李四','语文',70)   
insert into testScore values ('李四','数学',80)   
insert into testScore values ('李四','英语',90)

select tname as '姓名' ,    
max(case ttype when '语文' then tscor else 0 end) '语文',    
max(case ttype when '数学' then tscor else 0 end) '数学',    
max(case ttype when '英语' then tscor else 0 end) '英语'    
from testScore    
group by tname

实例二

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)

国家(country) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法国 300 日本 250 德国 200 墨西哥 50 印度 250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。

洲 人口 亚洲 1100 北美洲 250 其他 700

代码

SELECT SUM(population), CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END FROM Table_A GROUP BY CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;

同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;

SELECT CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END salary_class, COUNT(*) FROM Table_A GROUP BY CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END;

对于groupby后面一般都是跟一个列名,但在该例子中通过case语句使分组变得跟强大了。

实例三

有如下数据

国家(country) 性别(sex) 人口(population) 中国 1 340 中国 2 260 美国 1 45 美国 2 55 加拿大 1 51 加拿大 2 49 英国 1 40 英国 2 60

按照国家和性别进行分组,得出结果如下

时间: 2024-07-29 17:54:37

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

显示同一分组中的其他元素的sql语句_MsSql

1.原始查询表结果  2.理想查询表结果   一很牛的朋友写的sql语句大笑,学习啦偷笑: select userpwd,username=stuff((select ','+username from tuser t1 where t1.userpwd=t.userpwd for xml path('')),1,1,'') from tuser t group by userpwd 说明: a.stuff方法(举例说明:select stuff('abcdef', 2, 3, 'klmn');

显示同一分组中的其他元素的sql语句

1.原始查询表结果   2.理想查询表结果 一很牛的朋友写的sql语句大笑,学习啦偷笑: select userpwd,username=stuff((select ','+username from tuser t1 where t1.userpwd=t.userpwd for xml path('')),1,1,'') from tuser t group by userpwd 说明: a.stuff方法(举例说明:select stuff('abcdef', 2, 3, 'klmn');

非常好用的sql语句(日常整理)

1. /* 得到trace文件路径和名称 */ SELECT d.VALUE || '/' || LOWER (RTRIM (i.INSTANCE, CHR (0))) || '_ora_' || p.spid || '.trc' trace_file_name FROM (SELECT p.spid FROM v$mystat m, v$session s, v$process p WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.

oracle-Oracle中如何只用一条sql语句查询下面的例子

问题描述 Oracle中如何只用一条sql语句查询下面的例子 解决方案 select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][-n]其中selectstatement为待联合的SELECT查询语句.用联合查询足以 解决方案二: 这个只能在后台代码判断并组装语句,然后联表查询 解决方案三: Oracle SQL语句查询例子用一条SQL语句查询分组前三名数据常用的sql语句查询例子

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)

access|datagrid|分页|语句 DataGrid连接Access的快速分页法(2)--SQL语句的选用(升序)一.相关概念 在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的.并且索引页依据索引列的值进行排序,每个索引记录包含一个指向它所引用的数据行的指针.我们可以利用主键这两个特点来实现对某条记录的定位,从而快速地取出某个分页上要显示的记录. 举个例子,假设主键字段为 INTE

通过查询分析器对比SQL语句执行效率

可以方便地对不同的SQL语句进行效率对比.首先打开查询分析器,将查询菜单中的"显示执行计划"."显示服务器跟踪"."显示客户统计"都选中. 在编辑窗口中输入要进行对比的SQL语句,比如不同方式的查询: SELECT *FROM CRM_FWDWHERE RQ BETWEEN '2006-06-01' AND '2006-06-02'SELECT *FROM CRM_FWDWHERE DATEDIFF(DAY, RQ, '2006-06-01')

防止SQL语句注入攻击总结

-----解决方案-------------------------------------------------------- 过滤URL中的一些特殊字符,动态SQL语句使用PrepareStatement.. ------解决方案-------------------------------------------------------- 注入的方式就是在查询条件里加入SQL字符串. 可以检查一下提交的查询参数里是否包含SQL,但通常这样无益. 最好的办法是不要用拼接SQL字符串,可以用

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

第1部分 重新认识C语言 如何在C语言里面执行SQL语句? [文章摘要]         在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句.         本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词]          SQL语句  C语言  程序  流程  开发   一.为什么要在C语言程序中执行SQ

为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

    在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很多人想查看阻塞的源头(哪个SQL语句阻塞了哪个SQL),这样方便直观.简洁明了的定位问题.但是很多时候,很多场景,我们通过SQL语句并不能或者说不容易定位到阻塞者(Blocker)的SQL语句,当然我们可以很容易找到被阻塞的SQL语句,以及它在等待的锁资源.下面我们先分析一下SQL Serv