iT邦幫忙

9

蠻可愛的SQL Window Functions 應用 160202

這篇 T-SQL 多筆金額統計 顯示方法
http://ithelp.ithome.com.tw/question/10180955?tag=hp.all
匿名發問的, 鑒於以往匿名發問者時常刪除,
造成後續參考的困擾.
所以還是用分享的方式.

On Oracle
CREATE TABLE ithelp160202a(
firm CHAR(1) NOT NULL,
part CHAR(3) NOT NULL,
price INTEGER NOT NULL
);

INSERT ALL
INTO ithelp160202a VALUES('A', '123', 100)
INTO ithelp160202a VALUES('A', '456', 200)
INTO ithelp160202a VALUES('B', '789', 300)
SELECT 1
  FROM DUAL;
  
COMMIT;

SELECT firm
     , a.part
     , a.Price
     , CASE
        WHEN a.RowN = 1 THEN b.TotPri
        ELSE NULL
       END TotPri
  FROM (SELECT firm
             , part
             , SUM(price) OVER(PARTITION BY firm, part, price) Price
             , ROW_NUMBER() OVER(PARTITION BY firm ORDER BY part) RowN
         FROM ithelp160202a
        GROUP BY firm, part, price) a
  JOIN (SELECT firm
             , SUM(price) TotPri
          FROM ithelp160202a
         GROUP BY firm
       ) b
 USING (firm)
 ORDER BY firm, part; 

FIRM PART      PRICE     TOTPRI
---- ---- ---------- ----------
A    123         100        300
A    456         200 {NULL}
B    789         300        300

0
小財神
iT邦好手 1 級 ‧ 2016-02-02 12:30:32

小雨大這招好!
大家都學得到 ︿︿
讚

0
門神JanusLin
iT邦超人 1 級 ‧ 2016-02-02 13:01:07

小雨大終於到旁邊玩...........沙...............了

哈哈

^^

0
Albert
iT邦高手 1 級 ‧ 2016-02-03 09:05:11

共襄盛舉
提供另一種在 ERP 財務報表上實作案例::

<pre class="c" name="code">

SELECT a1.M_Product_ID,
       a1.QTYORDERED,
       a1.C_OrderLine_ID,
       CASE WHEN a1.C_OrderLine_ID=a1.min_C_OrderLine_ID THEN a1.sum_QtyOrdered 
       ELSE NULL
       END AS sum_QtyOrdered
  FROM (
SELECT a.M_Product_ID,
       a.QTYORDERED,
       a.C_OrderLine_ID,
    (SELECT MIN(b.C_OrderLine_ID) FROM C_OrderLine b WHERE b.M_Product_ID=a.M_Product_ID) AS min_C_OrderLine_ID,
    (SELECT SUM(b.QtyOrdered)     FROM C_OrderLine b WHERE b.M_Product_ID=a.M_Product_ID) AS sum_QtyOrdered
    FROM C_OrderLine a
ORDER BY a.M_Product_ID,a.C_OrderLine_ID
) a1
0
Albert
iT邦高手 1 級 ‧ 2016-02-03 09:19:18

小雨大的案例
很適合
不知道哪一筆會是排序出現後的第一筆
(但是小雨大例子的資料無法展現)
ROW_NUMBER() OVER(PARTITION BY firm ORDER BY part) RowN
如果不是 GROUP BY firm, part, price
可能會有兩筆以上相同 firm, part, price
所以需要 RowN 來自動給予序號
來判斷哪一個會是第一筆出現

0
一級屠豬士
iT邦高手 1 級 ‧ 2016-02-03 09:35:36

SQL Command很有趣的.albertachen 大大的也很有意思.
以後大家還是改用分享的,以免刪掉就都消失了.

0
Albert
iT邦高手 1 級 ‧ 2016-02-03 09:40:14

本來就想貼上去
但是這是腸鏡仁
不曉得是否會被砍掉
因此先放冰箱兩天觀察!!

看更多先前的回應...收起先前的回應...

改自己發就好了,腸鏡仁的以後也不好找.

hitomitanaka提到:
腸鏡仁

這個跟蝦仁有關係嗎?冷

跟蝦仁無關

總裁 iT邦好手 1 級‧ 2016-02-03 14:14:48 檢舉

這個妹子小腹有點突出喔...失神

wiselou提到:
蝦仁

吃太多了汗

一尾 iT邦研究生 1 級‧ 2016-02-03 15:13:27 檢舉

chingfeng提到:
吃太多了

所以
來跟著跟著老師 動吃動
https://www.youtube.com/watch?v=IZkYdqRWKaY

一尾 iT邦研究生 1 級‧ 2016-02-03 15:17:03 檢舉

hitomitanaka提到:
跟蝦仁無關

難到
跟那個跟我差不多帥的李大仁有關

疑惑

難道跟人類的祖先有關?疑惑冷

人類的祖先->花....因為,花生仁毆飛

吾命由我,不由天

哇 ! 被鎖圖

我要留言

立即登入留言