【问题标题】:Evaluate eligibility of clients based on active period根据活跃期评估客户的资格
【发布时间】:2016-08-15 02:13:28
【问题描述】:

我的查询似乎很简单,也许我想多了。考虑 2 个表:客户 A 和服务 B。客户表有 2 个日期,服务开始日期和服务结束日期。现在,我们的 KPI 是我们应该为当月与我们一起活动超过 15 天的每个客户提供至少 1 项服务。这是每月的 KPI。我的界面允许您选择 3 个月或 6 个月的报告周期,所需的报告是按月服务的客户计数。这将按月份和他们所在的地区分组。

客户表 A

   C_ID |  Name | SrvStDt  | SrvEndDt  |  ServManager  | Region
    1   | ABCD  | 1 Jan 16 | 10 Mar 16 |    AAAAAA     |  North
    2   | EDFG  | 1 Feb 16 | 15 Aug 16 |    BBBBBB     |  South
    3   | YTHG  | 1 Mar 16 |  1 Jul 16 |    CCCCCC     |  East
    4   | WEFG  | 21 Apr 16| 15 May 16 |    DDDDDD     |  West
    5   | POIU  | 18 May 16| 15 Jul 16 |    AAAAAA     |  North
    6   | QWER  | 30 Jun 16|   --      |    BBBBBB     |  South
    7   | CVBH  | 21 Jul 16|   --      |    CCCCCC     |  East
    8   | ASDR  | 1 Aug 16 |   --      |    DDDDDD     |  West
    9   | LKJU  | 15 Jan 16| 15 Jul 16 |    AAAAAA     |  North
   10   | MNBU  | 15 Mar 16| 15 Jul 16 |    BBBBBB     |  South

注意事项:没有结束日期表示客户端仍处于活动状态

服务表 B

   ID  |  SrvDAte
    1  | 15 Jan 16
    1  | 12 Feb 16
    1  | 01 Mar 16
    1  | 10 Mar 16
    2  | 15 Feb 16
    2  | 15 Mar 16
    2  | 31 Mar 16
    2  | 15 Apr 16
    2  | 15 May 16
    2  | 15 Jul 16
    2  | 15 Aug 16
    3  | 21 Mar 16
    3  | 23 Mar 16
    3  | 23 Apr 16
    3  | 23 May 16
    4  | 29 Apr 16
    5  | 23 May 16
    6  | 12 Jul 16
    7  | 23 Jul 16
    9  | 23 Mar 16
    9  | 23 Apr 16
    9  | 23 May 16
    10 | 19 Mar 16
    10 | 19 Apr 16
    10 | 19 May 16
    10 | 19 Jun 16

对于 4 月 1 日至 7 月 31 日的报告,我之后的结果将如下所示:

    Region  |  Month | Total Active | Total Serviced
    North   | Apr-16 |  XXXX        |  XXXX
    North   | May-16 |  XXXX        |  XXXX
    North   | Jun-16 |  XXXX        |  XXXX
    North   | Jul-16 |  XXXX        |  XXXX
    South   | Apr-16 |  XXXX        |  XXXX
    South   | May-16 |  XXXX        |  XXXX
    South   | Jun-16 |  XXXX        |  XXXX
    South   | Jul-16 |  XXXX        |  XXXX
    East    | Apr-16 |  XXXX        |  XXXX
    East    | May-16 |  XXXX        |  XXXX
    East    | Jun-16 |  XXXX        |  XXXX
    East    | Jul-16 |  XXXX        |  XXXX
    West    | Apr-16 |  XXXX        |  XXXX
    West    | May-16 |  XXXX        |  XXXX
    West    | Jun-16 |  XXXX        |  XXXX
    West    | Jul-16 |  XXXX        |  XXXX

我正在苦苦思索如何识别在整个报告期内每月至少活跃 15 天的客户。我可以在整个期间放置一个 between 子句,例如 4 月 1 日 - 7 月 1 日,但是我如何将它分成几个月并评估每个月?

我正在使用 MS Access VBA 和 SQL 查询。我想要一个 SQL 查询来给我这个结果集。

【问题讨论】:

  • 什么是 KPI - 请不要使用首字母缩略词 - 如果它们对问题不重要,请使用实际含义或删除它们
  • 这两个表是如何链接的——是Client.C_ID == Service.ID
  • 抱歉:KPI = 关键绩效指标,是 Client.C_ID = Service.ID
  • 您需要服务表做什么?您需要使用 VBA 每个月通过每个客户。必须尝试吗?

标签: sql vba ms-access


【解决方案1】:

我正在努力寻找在整个报告期内每月至少活跃 15 天的客户。我可以在整个期间放置一个 between 子句,例如 4 月 1 日 - 7 月 1 日,但是我如何将它分成几个月并针对每个月进行评估?

得出这些计数的一种方法是使用从零开始并涵盖开始日期和结束日期之间可能的最大天数的“数字表”,例如,

[Numbers]

  n
---
  0
  1
  2
  3
...
998
999

那么,对于样本数据

[TableA]

C_ID  SrvStDt     SrvEndDt  
----  ----------  ----------
   1  2016-01-01  2016-01-04
   2  2016-02-28  2016-03-02
   3  2016-08-10            

查询

SELECT 
    C_ID, 
    DateAdd("d", n, SrvStDt) AS SrvDate
FROM TableA, Numbers
WHERE 
    DateAdd("d", n, SrvStDt) <= Nz(SrvEndDt, Date())

返回

C_ID  SrvDate   
----  ----------
   1  2016-01-01
   1  2016-01-02
   1  2016-01-03
   1  2016-01-04
   2  2016-02-28
   2  2016-02-29
   2  2016-03-01
   2  2016-03-02
   3  2016-08-10
   3  2016-08-11
   3  2016-08-12
   3  2016-08-13
   3  2016-08-14
   3  2016-08-15

如果我们将其包装在聚合查询中以计算每个年/月中的日期 (GROUP BY)

SELECT
    C_ID,
    Year(SrvDate) AS SrvYear,
    Month(SrvDate) AS SrvMonth,
    COUNT(*) AS SrvDays
FROM
    (
        SELECT 
            C_ID, 
            DateAdd("d", n, SrvStDt) AS SrvDate
        FROM TableA, Numbers
        WHERE 
            DateAdd("d", n, SrvStDt) <= Nz(SrvEndDt, Date())
    )
GROUP BY
    C_ID,
    Year(SrvDate),
    Month(SrvDate)

我们得到

C_ID  SrvYear  SrvMonth  SrvDays
----  -------  --------  -------
   1     2016         1        4
   2     2016         2        2
   2     2016         3        2
   3     2016         8        6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多