亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

分組后分組合計以及總計SQL語句(稍微整理了一下)

2024-08-31 01:04:39
字體:
供稿:網(wǎng)友

今天看到了這個文章感覺內(nèi)容挺多的,就是比較亂,實在不好整理,VeVb武林網(wǎng)小編就簡單整理了一下,希望大家能湊合看吧

分組后分組合計以及總計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)統(tǒng)計分組后的種類數(shù):
 
例子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) 

上面的語句已經(jīng)可以滿足要求分組了.假設(shè)執(zhí)行后有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] 如何得到分組后,組中最大日期的紀(jì)錄

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分組,請問如何得到每組中時間最大的數(shù)據(jù)?

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

我的笨方法:

SELECT *FROM AWHERE (A,B) IN(SELECT A,MAX(B)FROM AGROUP 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語句分組獲取記錄的第一條數(shù)據(jù)的方法
使用Northwind 數(shù)據(jù)庫

首先查詢Employees表

查詢結(jié)果:

分組合計

city列里面只有5個城市

使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 先進行分組 注:根據(jù)COL1分組,在分組內(nèi)部根據(jù) COL2排序,而此函數(shù)計算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的).

sql語句為:

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

執(zhí)行結(jié)果圖:

分組合計

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

select出分組中的第一條記錄

執(zhí)行語句:

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

執(zhí)行結(jié)果圖:

分組合計

例子4:sql 獲取分組結(jié)果后,如何每一組的第一條記錄
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語句搞定分組并且每組限定記錄集的數(shù)量
 
如果我想得到這樣一個結(jié)果集:分組,并且每組限定記錄集的數(shù)量,用一條SQL語句能辦到嗎?

比如說,我想找出學(xué)生期末考試中,每科的前3名,只用一條SQL語句,該怎么寫?

表[TScore]的結(jié)構(gòu)

code      學(xué)號 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查詢以下偽數(shù)據(jù)獲取粗體字行的記錄
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
 
獲取每個分組中的第一條記錄,當(dāng)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語句
分享

有如下表結(jié)構(gòu):  
  字段      A,       B,       C  
  值為      a1,     b1,     c1  
            a2,     b2,     c2  
            a2,     b3,     c3  
            a3,     b4,     c4  
            a3,     b5,     c5  

想要得到的結(jié)果集以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)

現(xiàn)有數(shù)據(jù)表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   區(qū)號,count(*)   as   呼叫總量   from   call  
  group   by   substr(bj,1,4);  
  執(zhí)行結(jié)果  
   
  區(qū)號                         呼叫總量  
  ------------     --------------  
  0310                           1  
  0311                           2  
                                    2              
   
  2、zj分組,條件是th為950000的記錄  
  select   substr(zj,1,4)   as   區(qū)號,count(*)   as   呼叫總量   from   call  
  where   th=950000  
  group   by   substr(zj,1,4);  
  執(zhí)行結(jié)果:  
   
  區(qū)號                         呼叫總量  
  ------------     --------------  
  0310                           1  
  0311                           1  
   
  能否有一個語句就能實現(xiàn)如下結(jié)果:  
   
  區(qū)號                         呼叫總量  
  ------------     --------------  
  0310                           2  
  0311                           3  
   
  注:想要得到結(jié)果是1對應(yīng)的行加2對應(yīng)的行。

union起來再求和  
  select   區(qū)號,sum(呼叫總量)   from    
  (select   substr(bj,1,4)   as   區(qū)號,count(*)   as   呼叫總量   from   call  
  group   by   substr(bj,1,4))  
  union   all  
  (select   substr(zj,1,4)   as   區(qū)號,count(*)   as   呼叫總量   from   call  
  where   th=950000  
  group   by   substr(zj,1,4))  
  group   by   區(qū)號;

這個應(yīng)該在Oracle中運行

select    
          decode(th,'950000',substr(zj,1,4),substr(bj,1,4))   as   區(qū)號,  
          count(*)   as   呼叫總量    
from    
          call  
group   by  
          decode(th'950000',substr(zj,1,4),substr(bj,1,4))

decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)

該函數(shù)的含義如下:

IF 條件=值1 THEN
    RETURN(翻譯值1)
ELSIF 條件=值2 THEN
    RETURN(翻譯值2)
    ......
ELSIF 條件=值n THEN
    RETURN(翻譯值n)

ELSE
    RETURN(缺省值)
END IF

 

例子8:在SQL Server2005/2008中對記錄進行分組,并獲得每組前N條記錄
假設(shè)有一個表,SQL語句如下:
  
CREATE TABLE [dbo].[scan](
    [km] [int] NULL,
    [kh] [int] NULL,
    [cj] [int] NULL
) ON [PRIMARY]

    其中km為科目號、kh為考生號、cj為成績,現(xiàn)對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

最后得到的結(jié)果集如下圖所示。

分組合計

例子9:如何實現(xiàn)分組Group取前N條記錄的sql語句
在表A中根據(jù)字段B分組、根據(jù)字段C排序并查詢出每組中的前三條記錄,查詢結(jié)果要求包含所有字段,請問sql語句該怎么寫?下面的sql語句雖然可以實現(xiàn),但由于數(shù)據(jù)量比較大,耗費時間太長,有沒有不通過表聯(lián)接而直接分組取記錄的方法呢?多謝!
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

要求的結(jié)果是:
以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

連接查詢,判斷數(shù)量

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

生產(chǎn)一個內(nèi)部表,給內(nèi)部表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中行數(shù)量/
select @count=@@rowcount
/循環(huán)變量@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
/循環(huán)變量@looptime累加1/
select @looptime=@looptime+1
end
/顯示結(jié)果/
select *
from @abc
order by i,price

4.
用游標(biāo)來處理
方法和我的第3種方法類似,大家可以自己試試

我共寫了4種,不知道大家還有什么其他好方法,可以交流,謝謝。

今天用到了,利用此方法可以解決一個刪除重復(fù)記錄的問題

當(dāng)然表必須帶有唯一索引,仔細(xì)看以下代碼

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:如何取得分組后最后一條記錄的值?
 

還是很混亂,再排一下:

重新整理一下格式:

現(xiàn)有一表 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
 
--> 測試數(shù)據(jù):[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.49028c.com/article/106074.htm

例子12:sql的分類與分組統(tǒng)計
您需要了解如何使用某些SQL子句和運算符來安排SQL數(shù)據(jù),從而對它進行高效分析。下面這些建議告訴您如何建立語句,獲得您希望的結(jié)果。
以 有意義的方式安排數(shù)據(jù)可能是一種挑戰(zhàn)。有時您只需進行簡單分類。通常您必須進行更多處理——進行分組以利于分析與總計。可喜的是,SQL提供了大量用于分 類、分組和總計的子句及運算符。下面的建議將有助于您了解何時進行分類、何時分組、何時及如何進行總計。欲了解每個子句和運算符的詳細(xì)信息,請查看
。
#1:分類排序
通常,我們確實需要對所有數(shù)據(jù)進行排序。SQL的ORDER BY子句將數(shù)據(jù)按字母或數(shù)字順序進行排列。因此,同類數(shù)據(jù)明顯分類到各個組中。然而,這些組只是分類的結(jié)果,它們并不是真正的組。ORDER BY顯示每一個記錄,而一個組可能代表多個記錄。
#2:減少組中的相似數(shù)據(jù)
分類與分組的最大不同在于:分類數(shù)據(jù)顯示(任何限定標(biāo)準(zhǔn)內(nèi)的)所有記錄,而分組數(shù)據(jù)不顯示這些記錄。GROUP BY子句減少一個記錄中的相似數(shù)據(jù)。例如,GROUP BY能夠從重復(fù)那些值的源文件中返回一個唯一的郵政編碼列表:
SELECT ZIP
FROM Customers
GROUP BY ZIP
僅包括那些在GROUP BY和SELECT列列表中字義組的列。換句話說,SELECT列表必須與GROUP列表相匹配。只有一種情況例外:SELECT列表能夠包含聚合函數(shù)。(而GROUP BY不支持聚合函數(shù)。)
記住,GROUP BY不會對作為結(jié)果產(chǎn)生的組分類。要對組按字母或數(shù)字順序排序,增加一個ORDER BY子句(#1)。另外,在GROUP BY子句中您不能引用一個有別名的域。組列必須在根本數(shù)據(jù)中,但它們不必出現(xiàn)在結(jié)果中。
#3:分組前限定數(shù)據(jù)
您可以增加一個WHERE子句限定由GROUP BY分組的數(shù)據(jù)。例如,下面的語句僅返回肯塔基地區(qū)顧客的郵政編碼列表。
SELECT ZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ZIP
在GROUP BY子句求數(shù)據(jù)的值之前,WHERE對數(shù)據(jù)進行過濾,記住這一點很重要。
和GROUP BY一樣,WHERE不支持聚合函數(shù)。
#4:返回所有組
當(dāng) 您用WHERE過濾數(shù)據(jù)時,得到的組只顯示那些您指定的記錄。符合組定義但不滿足子句條件的數(shù)據(jù)將不會出現(xiàn)在組中。不管WHERE條件如何,如果您想包括 所有數(shù)據(jù),增加一個ALL子句。例如,在前面的語句中增加一個ALL子句會返回所有郵政編碼組,而不僅僅是肯塔基地區(qū)的組。
SELECT ZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ALL ZIP
照這個樣子,這兩個子句會造成沖突,您可能不會以這種方式使用ALL子句。當(dāng)您用聚合求一個列的值時,應(yīng)用ALL子句很方便。例如,下面的語句計算每個肯塔基郵政編碼的顧客數(shù)目,同時顯示其它郵政編碼值。
SELECT ZIP, Count(ZIP) AS KYCustomersByZIP
FROM Customers
WHERE State = 'KY'
GROUP BY ALL ZIP
得到的組由根本數(shù)據(jù)中的所有郵政編碼值構(gòu)成。但是,聚合列(KYCustomerByZIP)顯示為0,因為除肯塔基郵政編碼組外沒有別的組。
遠(yuǎn)程查詢不支持GROUP BY ALL。
#5:分組后限定數(shù)據(jù)
WHERE 子句(#3)在GROUP BY子句之前求數(shù)據(jù)的值。當(dāng)您希望在分組以后限定數(shù)據(jù)時,使用HAVING。通常,不管您使用WHERE還是HAVING,得到的結(jié)果相同。但要記住,這 兩個子句不能互換,這點很重要。如果您存在疑問,這里有一條應(yīng)用指南:過濾記錄時使用WHERE;過濾組時使用HAVING。
一般,您會用HAVING,利用聚合來求一個組的值。例如,下面的語句返回一個郵政編碼列表,但這個表內(nèi)可能不包含根本數(shù)據(jù)源中的每個郵政編碼:
SELECT ZIP, Count(ZIP) AS CustomersByZIP
FROM Customers
GROUP BY ZIP
HAVING Count(ZIP) = 1
僅僅那些只有一名顧客的組出現(xiàn)在結(jié)果中。
#6:詳細(xì)了解WHERE和HAVING
如果您仍然對WHERE和HAVING的用法感到迷惑,應(yīng)用下面的指導(dǎo)方法:
WHERE出現(xiàn)在GROUP BY之前;SQL在它分組記錄前求WHERE子句的值。
HAVING出現(xiàn)在GROUP BY之后;SQL在它分組記錄后求HAVING子句的值。
#7:用聚合總計分組值
分組數(shù)據(jù)有助于對數(shù)據(jù)進行分析,但有時您還需要組本身以外的其它信息。您可以增加一個聚合函數(shù)來總計分組數(shù)據(jù)。例如,下面的語句為每次排序顯示一個小計:
SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY OrderID
與其它的組一樣,SELECT和GROUP BY列表必須相匹配。在SELECT子句中包含一個聚合是這一規(guī)則的唯一例外。
#8:總計聚合
您可以通過顯示每個組的小計進一步總計數(shù)據(jù)。SQL的ROLLUP運算符為每個組顯示一個額外的記錄,一個小計。那個記錄是用聚合函數(shù)在每個組中求所有記錄的值的結(jié)果。下面的語句為每個組合計OrderTotal列。
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH ROLLUP
一個包含20和25這兩個OrderTotal值的組的ROLLUP行將顯示OrderTotal值45。ROLLUP結(jié)果的第一個值是唯一的,因為它求所有組記錄的值。那個值是整個記錄集的總和。
ROLLUP不支持聚合函數(shù)中的DISTINCT或GROUP BY ALL子句。
#9:總計每一列
CUBE運算符比ROLLUP更進一步,它返回每個組中每個值的總數(shù)。得到的結(jié)果與ROLLUP相似,但CUBE包括組中每一列的一個額外記錄。下面的語句顯示每個組的小計和每名顧客的一個額外總數(shù)。
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH CUBE
用CUBE得到的總計最為復(fù)雜。不僅完成聚合與ROLLUP的工作,而且還求定義組的其它列的值。也就是說,CUBE總計每一個可能的列組合。
CUBE不支持GROUP BY ALL。
#10:給總計排序
當(dāng)CUBE的結(jié)果雜亂無章時(一般都是這樣),可以增加一個GROUPING函數(shù),如下所示:
SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal
FROM Orders
GROUP BY Customer, OrderNumber
WITH CUBE
其結(jié)果包括每一行的兩個額外的值。
值1表明左邊的值是一個總計值——ROLLUP或CUBE的運算符的結(jié)果。
值0表明左邊的值是一個原始GROUP BY子句產(chǎn)生的詳細(xì)記錄。

在分組查詢中還可以配合使用HAVING子句,定義查詢條件。

使用group by進行分組查詢

在使用group by關(guān)鍵字時,在select列表中可以指定的項目是有限制的,select語句中僅許以下幾項:

〉被分組的列
〉為每個分組返回一個值得表達(dá)式,例如用一個列名作為參數(shù)的聚合函數(shù)


group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數(shù)的列,必須出現(xiàn)在 group by 后面(重要)

group by實例


實例一

數(shù)據(jù)表:

姓名 科目 分?jǐn)?shù)
張三 語文 80
張三 數(shù)學(xué) 98
張三 英語 65
李四 語文 70
李四 數(shù)學(xué) 80
李四 英語 90

期望查詢結(jié)果:

姓名 語文 數(shù)學(xué) 英語
張三 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   

---插入數(shù)據(jù)   
insert into testScore values ('張三','語文',80)   
insert into testScore values ('張三','數(shù)學(xué)',98)   
insert into testScore values ('張三','英語',65)   
insert into testScore values ('李四','語文',70)   
insert into testScore values ('李四','數(shù)學(xué)',80)   
insert into testScore values ('李四','英語',90)   


select tname as '姓名' ,    
max(case ttype when '語文' then tscor else 0 end) '語文',    
max(case ttype when '數(shù)學(xué)' then tscor else 0 end) '數(shù)學(xué)',    
max(case ttype when '英語' then tscor else 0 end) '英語'    
from testScore    
group by tname

實例二


有如下數(shù)據(jù):(為了看得更清楚,我并沒有使用國家代碼,而是直接用國家名作為Primary Key)

 

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

 

根據(jù)這個國家人口數(shù)據(jù),統(tǒng)計亞洲和北美洲的人口數(shù)量。應(yīng)該得到下面這個結(jié)果。

 

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

 

代碼

SELECT SUM(population),    CASE country        WHEN '中國'   THEN '亞洲'        WHEN '印度'   THEN '亞洲'        WHEN '日本'   THEN '亞洲'        WHEN '美國'   THEN '北美洲'        WHEN '加拿大' THEN '北美洲'        WHEN '墨西哥' THEN '北美洲'    ELSE '其他' ENDFROM  Table_AGROUP BY CASE country        WHEN '中國'   THEN '亞洲'        WHEN '印度'   THEN '亞洲'        WHEN '日本'   THEN '亞洲'        WHEN '美國'   THEN '北美洲'        WHEN '加拿大' THEN '北美洲'        WHEN '墨西哥' THEN '北美洲'    ELSE '其他' END;

同樣的,我們也可以用這個方法來判斷工資的等級,并統(tǒng)計每一等級的人數(shù)。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_AGROUP 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語句使分組變得跟強大了。

實例三

有如下數(shù)據(jù)

 

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

 

按照國家和性別進行分組,得出結(jié)果如下

 

國家
中國 340 260
美國 45 55
加拿大 51 49
英國 40 60

 

代碼

SELECT country,    SUM( CASE WHEN sex = '1' THEN            population ELSE 0 END), --男性人口    SUM( CASE WHEN sex = '2' THEN            population ELSE 0 END)  --女性人口FROM Table_AGROUP BY country;

GROUP BY子句中的NULL值處理
當(dāng)GROUP BY子句中用于分組的列中出現(xiàn)NULL值時,將如何分組呢?SQL中,NULL不等于NULL(在WHERE子句中有過介紹)。然而,在GROUP BY子句中,卻將所有的NULL值分在同一組,即認(rèn)為它們是“相等”的。

HAVING子句
GROUP BY子句分組,只是簡單地依據(jù)所選列的數(shù)據(jù)進行分組,將該列具有相同值的行劃為一組。而實際應(yīng)用中,往往還需要刪除那些不能滿足條件的行組,為了實現(xiàn)這個功能,SQL提供了HAVING子句。語法如下。

SELECT column, SUM(column)FROM tableGROUP BY columnHAVING SUM(column) condition value

說明:HAVING通常與GROUP BY子句同時使用。當(dāng)然,語法中的SUM()函數(shù)也可以是其他任何聚合函數(shù)。DBMS將HAVING子句中的搜索條件應(yīng)用于GROUP BY子句產(chǎn)生的行組,如果行組不滿足搜索條件,就將其從結(jié)果表中刪除。

HAVING子句的應(yīng)用
從TEACHER表中查詢至少有兩位教師的系及教師人數(shù)。

實現(xiàn)代碼:

SELECT DNAME, COUNT(*) AS num_teacherFROM TEACHERGROUP BY DNAMEHAVING COUNT(*)>=2

HAVING子句與WHERE子句的區(qū)別

HAVING子句和WHERE子句的相似之處在于,它也定義搜索條件。但與WHERE子句不同,HAVING子句與組有關(guān),而不是與單個的行有關(guān)。
1、如果指定了GROUP BY子句,那么HAVING子句定義的搜索條件將作用于這個GROUP BY子句創(chuàng)建的那些組。
2、如果指定WHERE子句,而沒有指定GROUP BY子句,那么HAVING子句定義的搜索條件將作用于WHERE子句的輸出,并把這個輸出看作是一個組。
3、如果既沒有指定GROUP BY子句也沒有指定WHERE子句,那么HAVING子句定義的搜索條件將作用于FROM子句的輸出,并把這個輸出看作是一個組。
4、在SELECT語句中,WHERE和HAVING子句的執(zhí)行順序不同。在本書的5.1.2節(jié)介紹的SELECT語句的執(zhí)行步驟可知,WHERE子句只能接收來自FROM子句的輸入,而HAVING子句則可以接收來自GROUP BY子句、WHERE子句和FROM子句的輸入。


注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
免费黄色在线观看| 久久久久久久久久毛片| 无码人妻aⅴ一区二区三区玉蒲团| 青草国产精品久久久久久| 一本色道久久88综合日韩精品| 91av国产在线| 日韩精品一区二区三区| 性欧美videos白嫩| 国产sm主人调教女m视频| 亚洲三级在线免费| www.97.| www.久久艹| 国产wwwxxx| 国产精品秘入口| 国产一区欧美| 成人免费视频77777| 中文字幕久热精品视频免费| 久久久久高清精品| 一区福利视频| 四虎成人精品在永久免费| 国产一区二区三区三区在线观看| 久久综合久久综合久久| 青春娱乐分类视频精品2动漫| 亚洲午夜久久久久中文字幕| 精品国产成人在线影院| 日韩乱码人妻无码中文字幕| 国产精品自产拍在线观看| 日韩一级片网站| 国产成人精品白浆久久69| 亚洲免费视频一区二区三区| 午夜精品久久久久久久无码| 手机看片福利永久| 日韩高清一区| 成年人在线观看视频免费| xxxx黄色| 国产精品中文久久久久久久| 国产字幕在线观看| 中文字幕激情视频| 少妇av一区二区三区无码| 亚洲第一偷拍网| 亚洲三级电影网站| 国产精品主播在线观看| 特黄三级视频| 免费成人av资源网| 欧美壮男野外gaytube| 欧美日韩在线视频免费播放| 国产95在线|亚洲| 欧洲av在线播放| 视频在线观看91| 婷婷亚洲五月色综合| 国产成人久久精品77777| 亚洲免费视频中文字幕| 久久久久黄久久免费漫画| 成人a'v在线播放| 日韩中文字幕一区二区高清99| 色综合视频二区偷拍在线| av网站在线免费看推荐| 国产99免费视频| 日韩精品一区二区三区免费观看| 在线观看17c| 午夜在线视频免费观看| 欧美高清视频看片在线观看| 999国产精品亚洲77777| 亚洲毛片亚洲毛片亚洲毛片| 国模大尺度视频一区二区| 国产情侣久久| 99久久99久久久精品棕色圆| 9l视频白拍9色9l视频| 欧美日韩在线免费| 在线视频亚洲一区| 国产成人在线播放视频| 亚洲黄色小说在线观看| 日本欧美视频| 欧美精品精品一区| 欧美日韩1区| 亚洲视频每日更新| 四虎国产精品永久免费观看视频| 一区二区三区美女视频| 国产女同无遮挡互慰高潮91| 美国av一区二区三区| 久久视频在线观看免费| 精品视频1区2区| 在线视频一区二区三区四区| 亚洲二区av| 93久久精品日日躁夜夜躁欧美| www日韩中文字幕在线看| 黄色片一级视频| 国产精品扒开腿做爽爽爽的视频| 91尤物视频在线观看| 日韩一区二区在线播放| 韩国精品一区| 欧美成人高清手机在线视频| 99精品视频在线观看免费播放| 日韩激情视频网站| 女人天堂亚洲aⅴ在线观看| 精品女同一区二区三区在线播放| eeuss中文字幕| 亚洲成人tv网| av资源新版天堂在线| 欧美精品www| 天天躁日日躁狠狠躁超碰2020| 久久久精品影院| 国产精伦一区二区三区| 国产成人亚洲精品青草天美| 欧美在线色视频| 国产视频精品网| 91在线你懂得| 一区二区三区视频免费在线观看| 天天综合91| 国产精品成人品| 日韩不卡在线| 欧美专区福利在线| 日本三级电影在线播放| 欧美小视频在线观看| 久久午夜福利电影| 国产精品一区二区小说| www视频在线观看免费| 久久久久噜噜噜亚洲熟女综合| 亚洲欧美国产精品久久久久久久| 亚洲国产精品va在线看黑人| 久久夜色精品| 最近的2019中文字幕免费一页| 91免费电影网站| 国产一区二区免费看| 中文字幕在线观看第三页| 欧美日韩亚州综合| 亚洲中文字幕在线一区| h片免费观看| 欧美成人专区| 视频在线一区二区三区| 日日摸日日碰夜夜爽无码| 在线免费观看视频网站| 免费看又色又爽又黄网站| 久久精品中文字幕免费mv| 99精品视频免费观看视频| 尤物tv国产一区| 国产 日韩 欧美 综合| 深爱五月综合网| 亚洲视频tv| 日韩美女av在线免费观看| 日韩精品久久一区二区| heyzo在线播放| 国产亚洲精品网站| 樱桃国产成人精品视频| 美女脱光内衣内裤视频久久影院| 亚洲香蕉av在线一区二区三区| 欧美日韩网址| 性一交一乱一精一晶| 国产日韩欧美不卡| 亚洲女同另类| 欧美猛交ⅹxxx乱大交视频| 午夜小视频福利在线观看| 精品人伦一区二区三区蜜桃免费| 黄色国产小视频| 国产99久久精品一区二区300| 日韩久久一区| 国产九九在线| 欧美成人免费视频| 免费成人在线视频观看| 日韩欧美第二区在线观看| 国产精品久久久久免费| 九色视频网站| 亚洲精品成人无码熟妇在线| 不卡的av电影| 男人添女人下部高潮视频在观看| 污网站视频在线观看| 日韩丝袜视频| 天堂网www在线观看| 日本三级黄色大片| 国产乱码精品一区二区三区不卡| 欧美人与牲动交xxxxbbbb| 图片区亚洲欧美小说区| 欧美午夜性囗交xxxx| 欧美日韩国产中字| 久久艳妇乳肉豪妇荡乳av| 免费h视频网站| 99成人在线观看| 国产一区二区三区在线看麻豆| 国产精品国精产品一二| 日韩一区自拍| 中国丰满人妻videoshd| 精品视频导航| 国产3级在线观看| www日韩在线观看| 特级丰满少妇一级| 亚洲天堂一区在线观看| 成人软件网18免费视频| 自拍偷拍福利视频| 女人色极品影院| 小泽玛利亚av在线| 国产视频丨精品|在线观看| xvideos亚洲人网站| 国产91精品青草社区| 欧美一区二区在线免费播放| 正义之心1992免费观看全集完整版| 国产aaaaa毛片| 一级一级黄色片| 99国产精品99久久久久久粉嫩| 麻豆极品一区二区三区| 无码国产精品久久一区免费| 国产午夜福利片| 国产一区不卡| 国产毛片毛片| 手机在线观看av网站| 性做爰过程免费播放| 奇米影视7777精品一区二区| 久久久久99精品成人片我成大片| 亚洲网在线观看| 久久精品视频一区二区三区| 欧美成人三级电影在线| 久无码久无码av无码| av动漫在线观看| 日韩理论电影中文字幕| 在线视频网站| av天在线观看| 亚洲淫片在线视频| 成人影院av| 天天摸天天碰天天爽天天弄| 亚洲精品在线二区| 强制捆绑调教一区二区| 一卡二卡三卡四卡| 色久视频在线播放| eeuss影院www在线观看免费| 欧美人与禽zoz0善交| 久久久蜜桃精品| 91美女精品福利| 日韩av三级在线观看| 精品处破学生在线二十三| 国产一区导航| 波多野结衣电影在线播放| 男女猛烈激情xx00免费视频| 亚洲不卡av不卡一区二区| 日本老太婆做爰视频| 黄色网址网站| 麻豆成人在线播放| 欧美激情小视频| 亚洲国产精品综合久久久| 性xx无遮挡| 欧美日韩国产精品成人| 自拍偷拍第1页| 91九色在线观看| 国产高潮呻吟久久久| 国产美女av在线| 毛片网站免费观看| xnxx国产精品| 国产精品视频在线免费观看| 欧美激情精品久久久久| 亚洲一级片网站| xx视频.9999.com| 国模吧精品人体gogo| 性做久久久久久久| 成人午夜一级| 国产aⅴ超薄肉色丝袜交足| 国产一级一级片| 波多野结衣乳巨码无在线| 日韩在线观看免费全| heyzo视频在线播放| 一本久道久久综合中文字幕| 亚洲色图19p| 亚洲乱码一区二区三区在线观看| 丁香花在线影院观看在线播放| 秋霞av亚洲一区二区三| 成人看片黄a免费看在线| 欧美无毛视频| 一区国产精品视频| 欧美福利电影在线观看| 亚洲av无码专区在线播放中文| 日本一二三视频| jizzjizzjizz中国免费| 亚洲激情专区| 亚洲视频 中文字幕| 中文在线а天堂av| 91中文字幕网| 午夜视频1000| 青青草精品视频在线观看| 国产在线三区| a天堂中文在线官网在线| 日韩成人综合| 欧美一区三区四区| 国产精品综合色区在线观看| 欧美一区二区三区婷婷月色| 一区二区三区我不卡| 午夜伦理福利在线| 成人黄色大片网站| 国产欧美日韩在线观看| 日本aⅴ中文| 2021中文字幕一区亚洲| 国产精品美女主播在线观看纯欲| 免费观看黄色一级视频| 韩国欧美亚洲国产| 久久久亚洲国产天美传媒修理工| 亚洲欧美成人一区二区在线电影| 麻豆视频在线免费观看| 一起操在线视频| 欧美三级电影一区| 亚洲国产精品久久久久婷婷老年| 996久久国产精品线观看| 一本色道久久精品| 国内在线观看一区二区三区| 久久中文资源| 日韩久久久久久久久久久久久| 日韩手机在线视频| 国产日韩亚洲欧美精品| 亚洲天堂伊人网| 精品国产一区二区三区久久久狼| 国内一区二区三区在线视频| 成人精品水蜜桃| 午夜精品一区二区三区在线观看| 国产成人免费看一级大黄| 国产精品videosex性欧美| 99高清视频有精品视频| 高清视频在线观看三级| 日韩欧美视频| 欧美日韩影院| 日韩大陆欧美高清视频区| 久久国产色av免费观看| 日韩av毛片在线观看| 午夜精品一区二区三区视频| 久久女同精品一区二区| 男女视频网站免费观看| 欧美一区二区三区少妇| 欧美日韩激情在线一区二区三区| 玖玖在线精品| 亚洲最新在线观看| 欧美少妇一级片| 狠狠躁夜夜躁人人躁婷婷91| 色哟哟在线观看视频| 亚洲免费视频在线观看|