修改了.
with var as (
select 100 as n
, 8 as p
), cal as (
select (n / p) * p as cutpnt
, n - (n / p) * p as tail
from var
), ids as (
select generate_series(1, var.n) as id
from var
)
select id
, case
when (id - 1) % var.n <= (cal.cutpnt - 1) then var.p
else cal.tail
end as boxinside
from ids
, cal
, var
;
+-----+-----------+
| id | boxinside |
+-----+-----------+
| 1 | 8 |
| 2 | 8 |
| 3 | 8 |
| 4 | 8 |
| 5 | 8 |
| 6 | 8 |
| 7 | 8 |
| 8 | 8 |
| 9 | 8 |
| 10 | 8 |
| 11 | 8 |
| 12 | 8 |
| 13 | 8 |
| 14 | 8 |
| 15 | 8 |
| 16 | 8 |
| 17 | 8 |
....
| 95 | 8 |
| 96 | 8 |
| 97 | 4 |
| 98 | 4 |
| 99 | 4 |
| 100 | 4 |
+-----+-----------+
(100 rows)
結果沒想到
他是要「8個一組8個一組最後剩的顯示3」(8,8,8,8,8,3)
典型射後不理.
抱歉
因為我還在修正
大大提供的
是以固定值後出現4
但我需要的是
最後一箱是除8的餘數
另外
可以看看我記錄
我都會回復
有些還會提供解答
非標準射後不理
你要自己說明算式啊.....你又沒說明,就貼8跟4.
這個我只能猜啊.
你自己要能把想要的說清楚啦.
能說清楚,剩下的就比較好處理了.
不然還不是卡在那邊.
"""
但我需要的是, 最後一箱是除8的餘數
"""
所以到底是最後一箱,還是最後四箱?
sorry..題目是
假如有100pcs
每8個裝一箱
能裝滿的都要顯示8
尾數箱裝不滿的話
要顯示剩餘的數量
1~8的欄位都要顯示8
2~16的欄位都要顯示8
3~24的欄位都要顯示8
.
.
.
88~96的欄位都要8
97~100的欄位都要4
修改了, n 代表總數, p 代表 每箱容量.
先以100, 8 為例.
之後當然可以產生大量的組合.
明天上班試試,今天在忙別的事!!先謝過~
請教一下GENERATE_SERIES這個函數
oracle和ms sql都沒有GENERATE_SERIES函數
是否有推薦的函數
謝謝
我在這裡使用 GENERATE_SERIES() 只是要用來舉例,
以我的理解,解你的問題,不在這個函數.
你卡關的點,應該是不會產生 判斷式 吧?
Oracle 跟 SQL Server 可以使用遞迴方式產生.
Oracle 另外還有 start with connect by 語法,
也可以產生.
另外還有一件事,我個人非常討厭把 SQL Server 這個資料庫
產品,不用正確的方式,叫為 MS SQL. 還有把 Oracle 寫成
oracle. MySQL 寫成 mysql,諸如此類的.因為資訊是很嚴謹
的學科.專有名詞都不能正確使用了,那後續是一團糟,
張冠李戴,雞同鴨講.徒然浪費時間與低效率.
你這個問題,應該要直接問,不定數(n)個貨品,箱子的容量為p,
要標示內裝數,這樣比較簡單明暸.
這個題目,我們再另外開討論串.會比較清楚.
完成了
最後用case when完成
先在cte1內
新增cus_num(依序號 自訂編號)
新增inbox 算出在第幾盒
新增outbox (算出在第幾箱)(後面8是每8pcs裝一盒,*2是每一箱裝兩盒)
,ROW_NUMBER() OVER (ORDER BY sn欄位) as cus_num
,ceil(ROW_NUMBER() OVER (ORDER BY sn欄位)) as inbox
,ceil(ROW_NUMBER() OVER (ORDER BY sn欄位)/(8*2)) as outbox
,totalQTY
之後再cte2處理上面cte1新增的資料
新增totalBox 重寫最大值(總箱數)
新增maxInbox 重寫最大值(外盒)
,max(cte1.outbox) over () as totalBox
,max(ceil(tc_sfb.cus_num / 8)) over () as maxInbox
在最外面用cte1和cte2的資料
將
totalBox = outbox
and
inbox = maxInBox
符合則取totalQTY/8之餘數
select ...
, case when
cte2.totalBox = cte1.outbox
and
cte1.inbox = cte2.maxinBox then mod (cte1.totalQTY,8)
else 8
end as QTD
from cte1,cte2 where .....
可能不是最好,但可以用,也很好理解
供給有需要的人參考
你應該直接把你的table跟資料描述出來,這個問題很簡單的.