我有以下資料集:
每日資料:
| 部門 | 班級 | 日期 | BOOK_ID | TRANSFER_RETAIL | TRANSFER_COST |
|---|---|---|---|---|---|
| 100 | 1 | 4 月 10 日 | 100 | 23.4 | 54 |
| 100 | 1 | 4 月 10 日 | 200 | 0 | 92 |
我想合并 TRANSFER_RETAIL AND TRANSFER_COST 的值并將其添加到 BOOK_ID = 100 的行
所以該行將顯示:
| 部門 | 班級 | 日期 | BOOK_ID | TRANSFER_RETAIL | TRANSFER_COST |
|---|---|---|---|---|---|
| 100 | 1 | 4 月 10 日 | 100 | 23.4 | 146 |
| 100 | 1 | 4 月 10 日 | 200 | 0 | 92 |
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
您可以使用MERGE陳述句來組合行:
MERGE INTO daily_data dst
USING (
SELECT dept,
class,
"DATE",
SUM(transfer_retail) AS transfer_retail,
SUM(transfer_cost) AS transfer_cost
FROM daily_data
WHERE book_id = 200
-- AND dept = 100
-- AND class = 1
-- AND "DATE" = DATE '2022-04-10'
GROUP BY dept, class, "DATE"
) src
ON ( dst.book_id = 100
AND dst.dept = src.dept
AND dst.class = src.class
AND dst."DATE" = src."DATE")
WHEN MATCHED THEN
UPDATE
SET transfer_retail = dst.transfer_retail src.transfer_retail,
transfer_cost = dst.transfer_cost src.transfer_cost;
其中,對于樣本資料:
CREATE TABLE DAILY_DATA (DEPT, CLASS, "DATE", BOOK_ID, TRANSFER_RETAIL, TRANSFER_COST) AS
SELECT 100, 1, DATE '2022-04-10', 100, 23.4, 54 FROM DUAL UNION ALL
SELECT 100, 1, DATE '2022-04-10', 200, 0, 92 FROM DUAL;
然后在 之后MERGE,表格將包含:
部門 班級 日期 BOOK_ID TRANSFER_RETAIL TRANSFER_COST 100 1 22 年 4 月 10 日 100 23.4 146 100 1 22 年 4 月 10 日 200 0 92
db<>在這里擺弄
uj5u.com熱心網友回復:
我建議創建一個 VIEW 比修改原始資料更好。這避免了更新查詢運行兩次等所有風險,并且原始資料始終可用。
CREATE TABLE DAILY_DATA(DEPT INT,CLASS int, "DATE" DATE,BOOK_ID INT, TRANSFER_RETAIL DECIMAL(5,2),TRANSFER_COST DECIMAL(5,2));
INSERT INTO DAILY_DATA SELECT 100, 1,to_date('2022-04-10','yyyy-mm-dd'),100,23.4,54 FROM dual UNION ALL SELECT 100, 1,to_date('2022-04-10','yyyy-mm-dd'), 200, 0, 92 FROM dual
CREATE VIEW TOTALLED AS SELECT DEPT, CLASS, "DATE", BOOK_ID, CASE WHEN BOOK_ID = 100 THEN SUM(TRANSFER_RETAIL) OVER(partition BY "DATE") ELSE TRANSFER_RETAIL end TRANSFER_RETAIL, CASE WHEN BOOK_ID = 100 THEN SUM(TRANSFER_COST) OVER(partition BY "DATE") ELSE TRANSFER_COST end TRANSFER_COST from DAILY_DATA;
SELECT * FROM TOTALLED;部門 | 課程 | 日期 | BOOK_ID | TRANSFER_零售 | TRANSFER_COST ---: | ----: | :-------- | ------: | --------------: | ------------: 100 | 1 | 22 年 4 月 10 日 | 200 | 0 | 92 100 | 1 | 22 年 4 月 10 日 | 100 | 23.4 | 146
db<>在這里擺弄
uj5u.com熱心網友回復:
與其將它們合并到已經存在的列中,不如添加一個新的虛擬列,例如
ALTER TABLE daily_data
ADD (
transfer_total AS ( transfer_retail transfer_cost )
);
它不會占用資料段內的任何額外空間,并且僅用于始終根據這兩列顯示所需的計算值。順便說一句,您當前列的值transfer_cost將保留為原始值,并且表的規范化規則將受到保護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461925.html
