[英]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.