sql - group by 之后獲取其它要的字段並根據where選定


具體業務是這樣的

一個庫房中的庫存是根據許多單據的生成來做更改的

如 到貨單保存后,進行了庫存的++, 出庫單保存后,該物料相應減少-- 等.

那么在展示列中,如果有一個期初庫存的字段,用來展示選定時間點時,當時庫存有多少余量,並根據時間日歷插件進行區間搜索.

而主要業務中的數值字段還有:

期初庫存 / 到貨量 / 出庫量 / 退庫量 / 結余數量

再解釋一下,

期初庫存是查取時間段后,它的上一個時間節點的結余數量

到貨量即 新到的貨物數量

出庫量即 派送出的貨物數量

退庫量即 回退的貨物數量

結余數量 = 期初+到貨-出庫+退庫(量)

首先如果沒有時間的區間檢索,完全可以記錄到一條數據元組上.

如:

在執行貨品"檸檬水"的到貨時,可以判斷當時庫存中是否有這個貨品,沒有執行INSERT,有則執行UPDATE,

INSERT時,將到貨量記錄到到貨量字段,其它字段為0,(在后續的出庫等操作時,進行UPDATE),

當庫存本來就有"檸檬水"庫存時,執行到貨量字段的UPDATE,如

到貨量 = 新到貨量+到貨量 (其它字段同樣,執行累加計算,*出庫量同樣是累加)

如果馬上要看到結余量,那么進行調用第二個方法,計算結余數量,進行結余數量字段的UPDATE.

 

現在假設有區間搜索,在搜索時,想要查看的數據時這個區間時間內的到貨,出庫,退庫,及結余量.

 

上圖展示了每條進行倉庫操作時的記錄數據,在區間搜索時假設時間是從22到28的,最終想要得到的結果

只有兩條,即"籃球"和"甲板",並將到貨量(shourushuliang),出庫量(fachushuliang),退庫量(tuihuishuliang)進行sum計算

那么還需要展示時間區間搜索的期初庫存量,即這個區間時間開始前,庫存還有多少量.

因為這個獲取回來用到了mysql的GROUP BY(貨品名稱),在獲取期初庫存時需要獲取到時間區間開始時間最貼近的ASC的那第一條的數值

而結余數量即時間區間結束時最貼近結束時間的DESC的那一條中的結余數量(jieyushuliang)

拿ID 26到28來說,在這個區間內,應該以 15作為返回的期初庫存, 以9作為返回的結余數量.

 

結果:

插入詳細數據時,需要動態獲取到前一個時間點該物料的結余數量

#新增物料庫存詳細,並填充期初庫存為它上一個日期節點的結余量
#需要insert其它字段,如rukukufang,dalei,jiagongyigong,
insert into wuliaokucunrizhi(mingchengguige,qichukucun,shourushuliang,fachushuliang,tuihuishuliang,jieyushuliang) 
values('甲板',IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi where createtime < (select now())
and mingchengguige='甲板' and rukukufang='A'and dalei='甲類'
order by createtime desc limit 1) jie),0),0,0,0,17);

這里的最后的數字17應該是動態的這里只是測試

 

獲取到最終按時間區間搜索所要呈現的結果集合

#3.將上兩條融合 有了搜索時間區間和其它條件的sum的集合
select 
DISTINCT(result1.mingchengguige),
substring_index(group_concat(result1.qichukucun order by createtime),',',1),
sum(shourushuliang),sum(fachushuliang),sum(tuihuishuliang),
substring_index(group_concat(result1.jieyushuliang order by createtime desc),',',1)
from(select * from wuliaokucunrizhi 
WHERE createtime >= '2019-12-27 22:02:00' 
AND createtime <= '2019-12-29 24:00:00'  AND rukukufang = 'A' AND dalei = '甲類')result1
GROUP BY mingchengguige

這里還應該將返回字段進行AS別名好映射實體類

 

最終結合mybatis 

   <select id="listKucunWithRiZhi" resultMap="BaseResultMap">
        select DISTINCT(kucunchaxun.mingchengguige)as mingchengguige,
        substring_index(group_concat(kucunchaxun.xiangmuweihu order by kucunchaxun.createtime desc),',',1)as
        xiangmuweihu,
        substring_index(group_concat(kucunchaxun.rukukufang order by kucunchaxun.createtime desc),',',1)as rukukufang,
        substring_index(group_concat(kucunchaxun.dalei order by kucunchaxun.createtime desc),',',1)as dalei,
        substring_index(group_concat(kucunrizhi.qichukucun order by kucunrizhi.createtime),',',1)qichukucun,
        sum(kucunrizhi.shourushuliang)shourushuliang,sum(kucunrizhi.fachushuliang)fachushuliang,sum(kucunrizhi.tuihuishuliang)tuihuishuliang,
        substring_index(group_concat(kucunrizhi.jieyushuliang order by kucunrizhi.createtime desc),',',1)jieyushuliang,
        substring_index(group_concat(kucunchaxun.jiagongyigong order by kucunchaxun.createtime desc),',',1)as
        jiagongyigong,
        substring_index(group_concat(kucunrizhi.createtime order by kucunrizhi.createtime desc),',',1)as createtime
        from wuliaokucunchaxun as kucunchaxun LEFT JOIN wuliaokucunrizhi as kucunrizhi ON kucunchaxun.mingchengguige =
        kucunrizhi.mingchengguige
        <where>
            <if test="mingchengguige != null and mingchengguige != '' ">
                <bind name="mingchengguigePattern" value="'%'+mingchengguige+'%'"/>
                and kucunchaxun.mingchengguige like #{mingchengguigePattern}
                and kucunrizhi.mingchengguige like #{mingchengguigePattern}
            </if>
            <if test="jiagongyigong != null and jiagongyigong != '' ">
                and kucunchaxun.jiagongyigong = #{jiagongyigong}
                and kucunrizhi.jiagongyigong = #{jiagongyigong}
            </if>
            <if test="rukukufang != null and rukukufang != '' ">
                and kucunchaxun.rukukufang = #{rukukufang}
                and kucunrizhi.rukukufang = #{rukukufang}
            </if>
            <if test="dalei != null and dalei != '' ">
                and kucunchaxun.dalei = #{dalei}
                and kucunrizhi.dalei = #{dalei}
            </if>
            <if test="createtime != null">
                and kucunrizhi.createtime = #{createtime}
            </if>
            <if test="updatetime != null">
                and kucunrizhi.updatetime = #{updatetime}
            </if>
            <if test="s_btime != null">
                and createtime &gt;= #{s_btime}
            </if>
            <if test="s_etime != null">
                and createtime &lt;= date_add(#{s_etime}, interval 1 day)
            </if>
        </where>
        GROUP BY kucunchaxun.mingchengguige
        <if test="sort == null">
            ORDER BY createtime DESC
        </if>
        <if test="sort != null and sort != ''">
            order by ${sort} ${order}
        </if>
    </select>

 

謝謝查看!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM