本周数据[已结束]

问题描述 投票:-3回答:4

确定已下订单当前周的客户总数。怎么做到呢?

select count(*) numberofcustomer from invoice
where invdate=sysdate-7;

它是否正确?

sql oracle
4个回答
1
投票

该问题要求“......客户总数......”,而不是发票总数。客户可以在一周内下多个订单。我不知道在你的表中标识客户的字段的名称是什么 - 让我们假设它是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表。

祝你好运。


1
投票

您可以使用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

DEMO


0
投票

试试这个:

select count(*) numberofcustomer from invoice where invdate>sysdate-7;

0
投票

请参阅Oracle第二天的函数...在您的情况下,您需要从fx的结果中减去7和14

© www.soinside.com 2019 - 2024. All rights reserved.