① sql中根據表中一個欄位分組分別統計每個分組的記錄數
分組統計可以參考以下操作:
當數組重復的時候分組才有意義,因為一個人也可以分為一組,只是沒有意義而已,分組採用GROUP BY語句完成,語法如下:
② sql中,按照某個欄位的內容進行分組,並在組內加序號
sqlserver2005及以上版本
SELECT ROW_NUMBER() OVER(PARTITION BY 種類 ORDER BY 種類) AS 序號,*
FROM 表
③ sql 分組 編號
如果有主鍵列,假設主鍵為ID:
select 列名,nid = (select count(1) from 表名 where 列名= a.列名 and id <= a.id)
from 表名 a
如果沒有主鍵列,必須造一個:
select identity(int,1,1) as id ,* into # from 表名
select 列名,nid = (select count(1) from # where 列名= a.列名 and id <= a.id)
from # a
SQL SERVER 2005及以後的版本,可以用roy_88的語法
④ SQL 中如何根據只根據第一個欄位分組
使用分析函數row_number() over (partiion by ... order by ...)來進行分組編號,然後取分組標號值為1的記錄即可。目前主流的資料庫都有支持分析函數,很好用。
其中,partition by 是指定按哪些欄位進行分組,這些欄位值相同的記錄將在一起編號;order by則是指定在同一組中進行編號時是按照怎樣的順序。
示例(SQL Server 2005或以上適用):
123456
select s.* from ( select *, row_number() over (partition by [手機號] order by [店鋪]) as group_idx from table_name) swhere s.group_idx = 1
⑤ sql 如何分組排序同時進行
1、首先輸入代碼:
SELECT * FROM (select * from CJ where Gender='女') m
where( select COUNT(*) from (select * from CJ where Gender='女') n
where m.Classid = n.Classid and n.English > m.English)<2
order by Classid, English desc
2、然後再輸入代碼:
SELECT * FROM CJ m
where(
select COUNT(*) from CJ n
where m.Classid = n.Classid and n.English > m.English and n.Gender='女')<2 --指的是內表
and Gender='女' --指的是外表
order by Classid, English desc
⑥ sql 分組編序號
題主你已經把SQL文寫出來了,既然誰時間早排前面,那你把desc去掉就行了。
SELECT*FROM(SELECTROW_NUMBER()OVER(PARTITIONBYSUBSTRING(CONVERT(varchar(100),Time,20),0,11)ORDERBYTime)ASxh,*FROMdbo.表)T
我用的oracle資料庫,sql文如下:
SELECT*FROM(SELECTROW_NUMBER()OVER(PARTITIONBYto_char(t.time,'yyyy-mm-dd')ORDERBYTime)ASxh,t.*FROMtestt)
⑦ SQL 分組數據
連載的上一篇文章,我們講到通過 SQL 聚合函數可以匯總數據,比如對行進行計數,計算和與平均數,獲取最大值和最小值。
但目前為止,我們的匯總都是正對所有行或匹配 WHERE 子句的數據上進行的。比如返回供應商 DLL01 提供的產品數目:
運行結果:
那如果我們想要返回每個供應商提供的產品數目呢?這就需要用到分組聚合了。使用分組可以將數據分為多個邏輯組,然後對每個組進行聚合計算。
分組的創建使用 SELECT 語句中的 GROUP BY 子句,比如下面的 SQL 返回每個供應商提供的產品數目:
運行結果:
上述 SELECT 語句返回兩個列, vend_id 為供應商 ID,是分組欄位; num_prods 為計算欄位,使用 count(*) 聚合而來。 GROUP BY 子句告訴 DBMS 按 vend_id 排序並分組數據,然後對每個分組而不是整個數據集進行聚合。
除了使用 GROUP BY 分組數據外, SQL 還允許過濾分組,規定包含哪些分組,排除哪些分組。比如,我們只想列出供應產品數目在 2 種以上的供應商及其供應產品的數目。
這里有個過濾條件: 供應產品數目大於 2 ,條件中的 供應產品數目 是針對分組後進行聚合產生的計算欄位,因此無法使用 WHERE 子句。 WHERE 子句過濾時指定的是行,而不是分組。
為此, SQL 提供了 HAVING 子句來過濾分組,並且 HAVING 支持所有 WHERE 操作符。下面,我們來完成供應產品數目在 2 種以上的供應商及其供應產品的數目。
運行結果:
跟前面的結果相比,供應產品數目等於 2 的供應商信息就不見啦~
關於 WHERE 子句和 HAVING 子句的區別,我們可以再通過一個案例理解一下。下面的 SQL 檢索具有兩個或以上產品且其價格大於等於 4 的供應商。
其中產品表如下:
SQL 語句如下:
運行結果:
截止目前,我們已經學了不少的 SELECT 子句,下面小魚針對目前我們已經學習的 SELECT 子句來總結一下他們在 SELECT 語句中的先後順序。
表中子句的排列順序即為它們在 SELECT 語句中依次出現的次序:
還是上面的例子,檢索具有兩個或以上產品且其價格大於等於 4 的供應商和其供應的產品數目,不過檢索檢索需要按照產品數目升序排列。
運行結果:
本節,我們學習了使用 GROUP BY 子句對多組數據進行匯總計算,並返回每個分組的結果。並實踐了如何使用 HAVING 子句過濾分組。
⑧ 關於SQL相同表分組排列組合的問題
建兩個序列,並通過一個函數調用序列(union 不支持直接使用序列),用於排序。
先用第二組所有行(3行),union all 3遍第一組第一行(left join 第二組,行數就和第二組一樣了)
在用第二組所有行(3行),union all 3遍第一組第二行(left join 第二組,行數就和第二組一樣了)
最後按照序號,組別,編號排序
/*
dropsequenceBig_Letter1;
CreatesequenceBig_Letter1
Incrementby1
Startwith65
Maxvalue999999
Minvalue1
Nocycle
nocache;
dropsequenceBig_Letter2;
CreatesequenceBig_Letter2
Incrementby1
Startwith65
Maxvalue999999
Minvalue1
Nocycle
nocache;
--獲取數列下一個值
createorreplacefunctionget_seq_next(seq_nameinvarchar2)returnnumber
is
seq_valnumber;
begin
executeimmediate'select'||seq_name||'.nextvalfromal'intoseq_val;
returnseq_val;
endget_seq_next;
*/
withtmpas(
select'1'groupid,'1'numfromal
union
select'1','2'fromal
union
select'2','1'fromal
union
select'2','2'fromal
union
select'2','3'fromal
)
selectchr(get_seq_next('Big_Letter1'))xuhao,t1.groupid,t1.num
fromtmpt1wheregroupid='2'
unionall
selectchr(get_seq_next('Big_Letter2'))xuhao,t1.groupid,t1.num
fromtmpt1,tmpt2
wheret1.groupid='1'andt1.num='1'andt2.groupid='2'
union
selectchr(get_seq_next('Big_Letter1'))xuhao,t1.groupid,t1.num
fromtmpt1wheregroupid='2'
unionall
selectchr(get_seq_next('Big_Letter2'))xuhao,t1.groupid,t1.num
fromtmpt1,tmpt2
wheret1.groupid='1'andt1.num='2'andt2.groupid='2'
orderbyxuhao,groupid,num
執行結果如下:
按照這個思路拼動態SQL吧