繁体   English   中英

如何从数据库中获取最近 13 个月的数据

[英]How do get last 13 months data from database

我有下表我想根据我的客户订单和月份获取最近 13 个月的数据:

create table dynamicorders 
(
    order_date date,
    order_total number(8),
    name varchar2(100)
);


insert into dynamicorders values( '2021-01-05', 705, 'jhone'); 
insert into dynamicorders values( '2021-01-15', 715, 'steve'); 
insert into dynamicorders values( '2021-01-17', 50, 'jhone'); 
insert into dynamicorders values( '2021-02-09', 802, 'mular'); 
insert into dynamicorders values( '2021-03-12', 812, 'steve'); 
insert into dynamicorders values( '2021-03-29', 829, 'steve'); 
insert into dynamicorders values( '2021-04-03', 903, 'jhone'); 
insert into dynamicorders values( '2021-04-29', 150, 'steve'); 
insert into dynamicorders values( '2021-05-19', 100, 'steve'); 
insert into dynamicorders values( '2022-01-10', 300, 'steve');
insert into dynamicorders values( '2022-01-18', 400, 'mular');

这是我需要的结果集的屏幕截图:

预期结果

您可以使用:

SELECT name,
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-01-01' THEN order_total END) AS "21-Jan",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-02-01' THEN order_total END) AS "21-Feb",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-03-01' THEN order_total END) AS "21-Mar",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-04-01' THEN order_total END) AS "21-Apr",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-05-01' THEN order_total END) AS "21-May",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-06-01' THEN order_total END) AS "21-Jun",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-07-01' THEN order_total END) AS "21-Jul",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-08-01' THEN order_total END) AS "21-Aug",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-09-01' THEN order_total END) AS "21-Sep",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-10-01' THEN order_total END) AS "21-Oct",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-11-01' THEN order_total END) AS "21-Nov",
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2021-12-01' THEN order_total END) AS "21-Dec",
       SUM(CASE TRUNC(order_date, 'YY') WHEN DATE '2021-01-01' THEN order_total END) AS TOTAL,
       SUM(CASE TRUNC(order_date, 'MM') WHEN DATE '2022-01-01' THEN order_total END) AS "22-Jan"
FROM   dynamicorders d
GROUP BY name

其中,对于您的样本数据,输出:

姓名 1月21日 2月21日 3月21日 4月21日 5月21日 21-6月 7月21日 8月21日 9月21日 10 月 21 日 11 月 21 日 12月21日 全部的 1月22日
约翰 755 null null 903 null null null null null null null null 1658 null
史蒂夫 715 null 1641 150 100 null null null null null null null 2606 300
穆尔 null 802 null null null null null null null null null null 802 400

如果您想要过去 13 个月,而不是特定月份,那么您不能提供与月份相关的动态列名(除非您使用动态 SQL)并且可以使用:

SELECT name,
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -12) THEN order_total END) AS "CURRENT_MONTH-12",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -11) THEN order_total END) AS "CURRENT_MONTH-11",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -10) THEN order_total END) AS "CURRENT_MONTH-10",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -9) THEN order_total END) AS "CURRENT_MONTH-9",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -8) THEN order_total END) AS "CURRENT_MONTH-8",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -7) THEN order_total END) AS "CURRENT_MONTH-7",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -6) THEN order_total END) AS "CURRENT_MONTH-6",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -5) THEN order_total END) AS "CURRENT_MONTH-5",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -4) THEN order_total END) AS "CURRENT_MONTH-4",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -3) THEN order_total END) AS "CURRENT_MONTH-3",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -2) THEN order_total END) AS "CURRENT_MONTH-2",
       SUM(CASE TRUNC(order_date, 'MM') WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'),  -1) THEN order_total END) AS "CURRENT_MONTH-1",
       SUM(CASE WHEN ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -12) <= order_date AND order_date < TRUNC(SYSDATE, 'MM') THEN order_total END) AS TOTAL,
       SUM(CASE TRUNC(order_date, 'MM') WHEN TRUNC(SYSDATE, 'MM') THEN order_total END) AS "CURRENT_MONTH"
FROM   dynamicorders d
GROUP BY name

哪个输出:

姓名 CURRENT_MONTH-12 CURRENT_MONTH-11 CURRENT_MONTH-10 CURRENT_MONTH-9 CURRENT_MONTH-8 CURRENT_MONTH-7 CURRENT_MONTH-6 CURRENT_MONTH-5 CURRENT_MONTH-4 CURRENT_MONTH-3 CURRENT_MONTH-2 CURRENT_MONTH-1 全部的 这个月
约翰 755 null null 903 null null null null null null null null 1658 null
史蒂夫 715 null 1641 150 100 null null null null null null null 2606 300
穆尔 null 802 null null null null null null null null null null 802 400

db<> 在这里摆弄

这是PIVOT function 的典型用例。

with mon as (
select 
trunc(ORDER_DATE,'MM') ORDER_MONTH, ORDER_TOTAL, NAME
from dynamicorders)
select * from mon
PIVOT (sum(ORDER_TOTAL) ORDER_TOTAL  for (ORDER_MONTH) in 
(date'2021-01-01' as "21-Jan",
 date'2021-02-01' as "21-Feb",
 date'2021-03-01' as "21-Mar",
 date'2021-04-01' as "21-Apr",
 date'2021-05-01' as "21-May",
 date'2021-06-01' as "21-Jun",
 date'2021-07-01' as "21-Jul",
 date'2021-08-01' as "21-Aug",
 date'2021-09-01' as "21-Sep",
 date'2021-10-01' as "21-Oct",
 date'2021-11-01' as "21-Nov",
 date'2021-12-01' as "21-Dec"
)
);

对于过去 N 个月的动态,您将需要动态SQL,因为PIVOT需要static表达式。

SELECT * FROM dynamicorders WHERE order_date >= DATEADD(MONTH, -13, CAST(GETDATE() AS DATE))

使用DATEADD function,它需要三个参数DATEADD(interval, number, date)

第一个参数是间隔,即(YEAR/MONTH/DAY)
第二个参数是数字,即(您希望根据间隔增加日期的次数)。
第三个参数是日期,即要修改的日期

查看此答案以获取更多信息获取过去 13 个月的数据
另请查看 Microsoft 官方页面上的DATEADD 文档,了解有关此 function 的详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM