在一个月内获得销售数量

时间:2020-07-06 13:22:30

标签: oracle oracle11g

我有每月代理商的销售数据。我需要获取前25天的销售计数和后5天的列。 如何分别进入。

我有下表

Agent_ID       Date         Device
2343          1/1/2019       33330
3245          1/1/2019       43554
2343          5/1/2019       46665
3245          10/1/2019      78900
2343          15/1/2019      55678
2343          26/1/2019      45678
3245          28/1/2019      48900
2343          30/1/2019      56710
5645          12/1/2019      33067
5645          15/1/2019      44890
2121          31/1/2019      55810

我需要在输出表下面获取它

Agent_ID   first_25days_sale_count     Last_5days_sale_count
2343                 3                          2
3245                 2                          1
5645                 2                          0
2121                 0                          1

1 个答案:

答案 0 :(得分:1)

某些月份有28、29或31天,因此如果天真地使用“前25天”和“后5天”,可能会导致重复计算(即2月为28天的第24和25天)或不计算某些天(例如,当月为31天的第26天)。您应该决定是否要计数:

  • 最初的25天,然后是剩余的3-6天;或
  • 最近5天,然后是之前的23-26天。

无论选择哪种方式,都可以使用条件聚合:

SELECT agent_id,
       COUNT(
         CASE
         WHEN EXTRACT( DAY FROM "Date" ) <= 25
         THEN 1
         END
       ) AS first_25days_sale_count,
       COUNT(
         CASE
         WHEN EXTRACT( DAY FROM "Date" ) > 25
         THEN 1
         END
       ) AS after_first_25days_sale_count,
       COUNT(
         CASE
         WHEN "Date" < TRUNC( LAST_DAY( "Date" ) ) - INTERVAL '4' DAY
         THEN 1
         END
       ) AS not_last_5days_sale_count,
       COUNT(
         CASE
         WHEN "Date" >= TRUNC( LAST_DAY( "Date" ) ) - INTERVAL '4' DAY
         THEN 1
         END
       ) AS last_5days_sale_count
FROM   your_table
GROUP BY agent_id;

因此,对于您的示例数据:

CREATE TABLE your_table ( Agent_ID, "Date", Device ) AS
SELECT 2343, DATE '2019-01-01', 33330 FROM DUAL UNION ALL
SELECT 3245, DATE '2019-01-01', 43554 FROM DUAL UNION ALL
SELECT 2343, DATE '2019-01-05', 46665 FROM DUAL UNION ALL
SELECT 3245, DATE '2019-01-10', 78900 FROM DUAL UNION ALL
SELECT 2343, DATE '2019-01-15', 55678 FROM DUAL UNION ALL
SELECT 2343, DATE '2019-01-26', 45678 FROM DUAL UNION ALL
SELECT 3245, DATE '2019-01-29', 48900 FROM DUAL UNION ALL
SELECT 2343, DATE '2019-01-30', 56710 FROM DUAL UNION ALL
SELECT 5645, DATE '2019-01-12', 33067 FROM DUAL UNION ALL
SELECT 5645, DATE '2019-01-15', 44890 FROM DUAL UNION ALL
SELECT 2121, DATE '2019-01-31', 55810 FROM DUAL;

这将输出:

AGENT_ID | FIRST_25DAYS_SALE_COUNT | AFTER_FIRST_25DAYS_SALE_COUNT | NOT_LAST_5DAYS_SALE_COUNT | LAST_5DAYS_SALE_COUNT
-------: | ----------------------: | ----------------------------: | ------------------------: | --------------------:
    3245 |                       2 |                             1 |                         2 |                     1
    2121 |                       0 |                             1 |                         0 |                     1
    5645 |                       2 |                             0 |                         2 |                     0
    2343 |                       3 |                             2 |                         4 |                     1

db <>提琴here

相关问题