Oracle 分組求和(特殊處理)

2021-08-17 15:17:26 字數 2189 閱讀 6355

首先我們都應該知道分組求和要用到這個group by,而這也是她最普遍的用法。

select hi.descriptions, sum(nvl(hi.qty, 0))

from hcm_items hi

where 1 = 1

group by hi.descriptions

可能難點還有集合內求和,用於求結果集中同類和

select sum(alias.assemble_qty) over (partition by alias.workcell_id)

from emt_issue_process_act alias

where 1 = 1;

上面的是group by的常用用法,接下來就簡單說一下她的一些公升級用法,集體什麼效果就不一一貼圖示呢,想要知道效果,還是得自己嘗試,畢竟經過自己手的東西,才有可能成為自己的東西,簡單說完公升級用法,再來仔細說我想要說的加點料,因為除了特殊料之外,其他的很多人都已經做過了,並且很多人也吃過了。

group by rollup(欄位a,欄位b),rollup 後面跟了n個字段,就將進行n+1次分組,從右到左每次減少乙個字段進行分組;然後進行 union

group by cube(欄位a,欄位b),   cube 後面跟了n個字段,就將進行2的n次方的分組運算;然後進行 union

除此之外還有grouping函式和grouping set方法,這兩個用的相對較少,前乙個是看行列分組情況的,後乙個可以代替多次union,需要詳細了解的可以去其他地方看看,這裡就 不多做解釋了,原諒博主的懶。。。

接下來說一下關於料的問題,先上一張圖吧。

看這個圖,不知道你有沒有閃過一些實現的思路。。。

這裡對圖示內容解釋一下吧,看第一列值,可以看出,這是乙個排序後的結果,而第二列則是第一列分組求和的數值。這裡可能大家就會有疑問了,分組求和後,相同的列不是會何並,然後在對應的行列得到乙個求和值嗎?這裡怎麼不是這樣的。正因為不是這樣,所以這才是真正的料。下面就給大家看看實現的具體sql吧。

with item as

(select t.descriptions,

case

when t.qty < 0 then

null

else

t.qty

end qty,

rownum seq

from (select hi.descriptions, -rownum qty

from hcm_items hi

where hi.items_code = 'test'

union

select hi.descriptions, sum(hi.qty) qty

from hcm_items hi

where hi.items_code = 'test'

group by hi.descriptions) t)

select tab.descriptions, tab.qty

from item tab

where tab.seq not in (select t.seq - 1 from item t where t.qty is not null)

order by tab.descriptions, tab.qty;

看了sql,先給科普一下別的一點知識,然後再一點點解釋一下這句sql。

union: 去除重覆記錄

union  all :  保留重覆記錄

intersect:   取交集

minus:  取差集 

接下來我就按照這句sql的大體執行順序來解釋一下這句sql吧。我們可以注意到,第一部分執行的sql是由union來合併的兩個資料集合,第乙個集合很簡單,就是將對應資料查出來,需要注意的是,數值列數取的rownum的負值,而第二個資料集合是取的分組求和結果集。接下來第二層就是將非求和值的負值清空,將這樣的結果集用with as語句定義為乙個子查詢部分。最後再將這樣的結果去掉彙總行的前一行,然後排序,便能得到這樣乙個特別的準確的結果。

或許這不是乙個最好的辦法,但是也是實現這個效果的乙個思路,有思路便能類推,解決更多的問題。。。如有道友有更好的思路,還望告知,謝謝

elasticsearch 分組求和

我使用的是elasticsearch6.4.3,resthighlevelclient獲取客戶端,直接上 吧 1 action 字段型別為long map map2 searchclient.searchgrouplong sourcebuilder,searchrequest,aggname,ag...

sql分組求和

需求是 乙個月有多個發布額,現在要求按月統計發布額,例如 1月發布額 35900,2月發布額 2300 sql 語句如下 按月分組,求和 select dmonth,codename,sum iamount from 求出全部日期,發布額 select convert varchar 7 a.dre...

Mysql分組求和 LIMIT

分組求和 mysql select coalesce name,總數 sum singin assingin count from employee tbl group by name with rollup coalesce name,總數 singin count 小麗 2 小明 7 小王 7 ...