`select
order_price,
To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd hh24') as order_date,
SUM(order_price) OVER(ORDER BY To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd
hh24')) as "bth"
from order_tbl
where seller_no=100
order by order_date;`

我得到了這個結果。
但我想得到的資料如下。
20000 / 20220524 15 / 52500
13000 / 20220524 15 / 52500
19500 / 20220524 15 / 52500
19600 / 20220524 16 / 72100
222000 / 20220524 17 / 738700
即使沒有資料...
0 / 20220524 18 / 738700
0 / 20220524 19 / 738700
0 / 20220524 20 / 738700。
.
.
.
0 / 20220525 10 / 738700
13600 / 20220525 11 / 787300
像這樣。
即使沒有資料,我也想每小時獲取 order_date 和 bth。
這對我來說太難了,但我該怎么辦?
我將洗掉 order_price 并稍后添加 distinct。
uj5u.com熱心網友回復:
你可以試試這個:(閱讀下面的指南)
db<>小提琴
WITH all_hour AS (
SELECT LEVEL AS hour
FROM dual
CONNECT BY LEVEL <= 24
),
all_date AS (
SELECT TO_CHAR(DATE'2022-05-24' LEVEL - 1, 'YYYYMMDD') AS dt
FROM dual
CONNECT BY LEVEL <= (DATE'2022-05-27' - DATE'2022-05-24' 1)
),
all_date_hour AS (
SELECT dt || ' ' || (CASE WHEN hour < 10 THEN '0' || TO_CHAR(hour) ELSE TO_CHAR(hour) END) AS order_date
FROM all_date
CROSS JOIN all_hour
),
your_order AS (
SELECT
order_price,
TO_CHAR(TO_DATE(order_date,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDD HH24') AS order_date,
seller_no
FROM order_tbl
),
your_sum AS (
SELECT adh.order_date, SUM(CASE WHEN yo.seller_no = 100 THEN yo.order_price ELSE 0 END) AS bth
FROM all_date_hour adh
LEFT JOIN your_order yo ON adh.order_date = yo.order_date
GROUP BY adh.order_date
)
SELECT order_date, SUM(bth) OVER(ORDER BY order_date) AS bth
FROM your_sum
ORDER BY order_date;
概括:
(1) 表一:all_hour
- 包括從 1 到 24 的數字
(2) 表2:all_date
- 包括從“2022-05-24”到“2022-05-27”的日期。
- 如果您喜歡的范圍是“2022-01-01”到“2022-12-31”,只需更改“2022-05-24”(第 7 和 9 行)->“2022-01-01”和“2022” -05-27'(第 9 行)-> '2022-12-31'
(3) 表 3:all_date_hour
- 包括格式為“YYYYMMDD HH24”的日期,例如“20220524 01”
- 這是交叉連接第一個和第二個表的結果
(4) 表4:your_order
- 與您的示例表order_tbl相同,只需將 order_date 重新格式化為“YYYYMMDD HH24”格式,例如“20220524 01”
(5) 表 5:your_sum(尚未累積)
- order_price 的簡單求和,按 order_date 分組
- 此處使用左連接,以便包括all_date_hour的所有日期
- 可以在
case陳述句中添加任何附加條件(第 24 行) - 例如,參見(第 24 行)
SUM(CASE WHEN yo.seller_no = 100 AND youradditionalcondition = somecondition THEN yo.order_price ELSE 0 END)
(6)最終選擇查詢:
- 累積總和在這里使用
SUM() OVER(ORDER BY *yourexpr*)
uj5u.com熱心網友回復:
您可以使用此查詢 - 稍后解釋:
select
to_date('01/01/2022 00:00:00','dd/mm/yyyy hh24:mi:ss') all_hours.sequence_hour/24 order_date_all,
order_price,
To_char(order_date, 'yyyymmdd hh24') as order_date_real,
SUM(order_price) OVER(ORDER BY To_char(order_date, 'yyyymmdd hh24')) as "bth"
from order_tbl ,
(SELECT LEVEL sequence_hour
FROM dual
CONNECT BY LEVEL <= 10) all_hours
where trunc((order_date( )-to_date('01/01/2022 00:00:00','dd/mm/yyyy hh24:mi:ss'))*24) = all_hours.sequence_hour
and seller_no( )=100
order by 1;
解釋:
- 您不需要執行 To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd hh24') - 這意味著您采用已經是日期的“order_date”并將其再次轉換為日期。不需要
- 我添加了最大小時數 - 它是子查詢 all_hours。僅作為示例,它限制為 10,您可以將其更改為任何其他值
- 我已經添加了您要顯示資料“01/01/2022”的起始時間點 - 如果需要,可以更改它。注意它出現在 2 個地方。
- 我添加了一個帶有 order_tbl 的外部連接 - 注意 where 條件中的“( )”。如果您想在 order_tbl 上添加其他條件 - 請記住在列的右側添加 ( ),就像我對“seller_no”所做的那樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484738.html
