确定已下订单当前周的客户总数。怎么做到呢?
select count(*) numberofcustomer from invoice
where invdate=sysdate-7;
它是否正确?
该问题要求“......客户总数......”,而不是发票总数。客户可以在一周内下多个订单。我不知道在你的表中标识客户的字段的名称是什么 - 让我们假设它是CUSTOMER_ID
。要获得个人客户的总数,您应该使用COUNT(DISTINCT CUSTOMER_ID)
,如下所示:
WITH cteCURRENT_WEEK AS (SELECT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') - INTERVAL '7' DAY AS BEGINNING_OF_WEEK,
NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') - INTERVAL '1' SECOND AS END_OF_WEEK
FROM DUAL)
SELECT COUNT(DISTINCT CUSTOMER_ID) AS NUMBER_OF_CUSTOMERS
FROM INVOICE i
CROSS JOIN cteCURRENT_WEEK w
WHERE i.INVDATE BETWEEN w.BEGINNING_OF_WEEK AND w.END_OF_WEEK
这假定“周”从星期一的第一秒到星期日的最后一秒开始。如果您的企业使用不同的周界限,则必须根据需要调整cteCURRENT_WEEK
。
此外 - 问题是询问ORDERS的总数,而不是INVOICES的总数。发票是装运单据,显示已发送给客户的货物。订单是进货单据,显示客户想要的内容。这是两个非常不同的事情,并且在特定周内收到订单并不意味着它将在同一周内开具发票。如果您有一个CUSTOMER_ORDER表(或类似的东西),您可能应该使用它来确定订单数,而不是INVOICE表。
祝你好运。
您可以使用TRUNC
获取当周的第一天。
这比较星期一到星期日
where invdate >= TRUNC(SYSDATE,'IW') AND invdate < TRUNC(SYSDATE,'IW') + 7
这比较当前的WEEKDAY(星期一到星期五)
where invdate >= TRUNC(SYSDATE,'IW') AND invdate < TRUNC(SYSDATE,'IW') + 5
请注意,<
条件用于防止重叠。例如,如果您要比较从dec-25开始的那一周,它应该比较范围:25.12.2017 00:00:00 and 29.12.2017 23:59:59
试试这个:
select count(*) numberofcustomer from invoice where invdate>sysdate-7;
请参阅Oracle第二天的函数...在您的情况下,您需要从fx的结果中减去7和14