iT邦幫忙

0

MS SQL or Oracle 的SQL語法一問~~

  • 分享至 

  • xImage

請問在不使用T-SQL 和 PL SQL之下
單純使用SQL語法
有辦法算出D欄位的值嘛?
(C只是我想要的算法) 不再TABLE內

如下圖
假如有20個產品
要八個為一組
1~8要SHOW 8
9~16要SHOW 8
16~20 要SHOW 4 (尾數)
不能用where mod,因為需要帶出sn序號
用where會把中間序號略過
可以用什麼方法來做?

https://ithelp.ithome.com.tw/upload/images/20191216/20082456PhQs8SeZVv.jpg

石頭 iT邦高手 1 級 ‧ 2019-12-16 20:09:32 檢舉
請問為什麼不要使用t sql 和Oracle?
你嘗試過那些辦法?
阿偉 iT邦新手 2 級 ‧ 2019-12-17 08:43:38 檢舉
因為我沒學過PL SQL ,要從T SQL 轉成 PL SQL 之前遇到很多問題,沒能解決
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2019-12-16 22:31:03
最佳解答

修改了.

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)
/images/emoticon/emoticon46.gif

典型射後不理.

/images/emoticon/emoticon57.gif

阿偉 iT邦新手 2 級 ‧ 2019-12-18 17:28:23 檢舉

抱歉
因為我還在修正
大大提供的
是以固定值後出現4
但我需要的是
最後一箱是除8的餘數
另外
可以看看我記錄
我都會回復
有些還會提供解答
非標準射後不理

你要自己說明算式啊.....你又沒說明,就貼8跟4.
這個我只能猜啊.
你自己要能把想要的說清楚啦.
能說清楚,剩下的就比較好處理了.
不然還不是卡在那邊.
"""
但我需要的是, 最後一箱是除8的餘數
"""
所以到底是最後一箱,還是最後四箱?

阿偉 iT邦新手 2 級 ‧ 2019-12-18 17:41:02 檢舉

sorry..題目是
假如有100pcs
每8個裝一箱
能裝滿的都要顯示8
尾數箱裝不滿的話
要顯示剩餘的數量

阿偉 iT邦新手 2 級 ‧ 2019-12-18 17:43:03 檢舉

1~8的欄位都要顯示8
2~16的欄位都要顯示8
3~24的欄位都要顯示8
.
.
.
88~96的欄位都要8
97~100的欄位都要4

修改了, n 代表總數, p 代表 每箱容量.
先以100, 8 為例.
之後當然可以產生大量的組合.

阿偉 iT邦新手 2 級 ‧ 2019-12-19 17:33:52 檢舉

明天上班試試,今天在忙別的事!!先謝過~

阿偉 iT邦新手 2 級 ‧ 2019-12-20 13:57:12 檢舉

請教一下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,
要標示內裝數,這樣比較簡單明暸.

這個題目,我們再另外開討論串.會比較清楚.

阿偉 iT邦新手 2 級 ‧ 2019-12-23 15:16:24 檢舉

完成了
最後用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跟資料描述出來,這個問題很簡單的.

我要發表回答

立即登入回答