我想在Oracle中获取每小时的累计金额
I want to get the accumulated amount every hour in Oracle
`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 并稍后添加不同的。
您可以使用此查询 - 稍后解释:
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”
中所做的那样在列的右侧添加 (+)
您可以试试这个:(阅读下面的指南)
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) Table 1 : all_hour
- 包括从 1 到 24 的数字
(2) Table 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) Table 3 : all_date_小时
- 包括 'YYYYMMDD HH24' 格式的日期,例如'20220524 01'
- 这是交叉连接第一个和第二个的结果table
(4) Table 4: your_order
- 与您的样本 table、order_tbl 相同,只是将 order_date 重新格式化为格式 'YYYYMMDD HH24',例如'20220524 01'
(5) Table 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) 最终 Select 查询:
- 这里使用
SUM() OVER(ORDER BY *yourexpr*)
进行累计
`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 并稍后添加不同的。
您可以使用此查询 - 稍后解释:
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” 中所做的那样在列的右侧添加 (+)
您可以试试这个:(阅读下面的指南)
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) Table 1 : all_hour
- 包括从 1 到 24 的数字
(2) Table 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) Table 3 : all_date_小时
- 包括 'YYYYMMDD HH24' 格式的日期,例如'20220524 01'
- 这是交叉连接第一个和第二个的结果table
(4) Table 4: your_order
- 与您的样本 table、order_tbl 相同,只是将 order_date 重新格式化为格式 'YYYYMMDD HH24',例如'20220524 01'
(5) Table 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) 最终 Select 查询:
- 这里使用
SUM() OVER(ORDER BY *yourexpr*)
进行累计