sql - 将 SQL 结果分组为 2 个子级别

标签 sql ms-access vba

我在后端使用 Access 前端屏幕和 SQL 查询。我正在尝试获取按 2 个级别分组的结果集:区域和月份,然后是该期间内活跃客户总数、有订单的客户和没有订单的客户的相关计数,所有这些都在用户选择的期间内。

下面是正在使用的 2 个表

客户端表A

    ID   |  Region   |  StartDate  |   Name
     1   |  North    |   1 Jan 16  |   ABC
     2   |  North    |   1 Mar 16  |   DEF
     3   |  East     |   1 Jul 16  |   GHE
     4   |  East     |   1 Aug 16  |   HIJ
     5   |  West     |   1 Feb 16  |   KLM
     6   |  West     |   1 Mar 16  |   NOP
     7   |  South    |   1 Apr 16  |   QUR
     8   |  South    |   1 Jan 16  |   STU

订单表 B

    OrderID | Client ID   |Order Date
     1      |    1        | 15 Mar 16  
     2      |    3        | 15 Jul 16  
     3      |    5        | 15 Jun 16  
     4      |    8        | 15 Jul 16  
     5      |    6        | 15 Jul 16  
     6      |    4        | 15 Jan 16  
     7      |    2        | 15 Feb 16  
     8      |    1        | 15 Jul 16  
     9      |    3        | 05 Aug 16  
    10      |    3        | 16 Jul 16  
    11      |    2        | 15 May 16  
    12      |    4        | 15 May 16  
    13      |    6        | 15 May 16  
    14      |    7        | 15 Mar 16  

用户选择报告的开始日期和结束日期,例如2016年5月1日至2016年7月31日 我需要一个查询来评估客户开始日期是否在报告期内并产生以下输出:

结果集

    Region | Month  |Total Clients|Clients with Orders|Clients w/o Orders
    North  |May-2016|   2         |   1               |     1
    North  |Jun-2016|   2         |   0               |     2
    North  |Jul-2016|   2         |   1               |     1
    East   |May-2016|   0         |   0               |     0
    East   |Jun-2016|   0         |   0               |     0
    East   |Jul-2016|   1         |   1               |     0
    West   |May-2016|   2         |   1               |     1
    West   |Jun-2016|   2         |   0               |     2
    West   |Jul-2016|   2         |   1               |     1
    South  |May-2016|   2         |   0               |     2
    South  |Jun-2016|   2         |   0               |     2
    South  |Jul-2016|   2         |   1               |     1

我已经在这个问题上坚持了两周了..请帮助!!!

如果有帮助,这就是我已经走了多远

    PARAMETERS startDt DateTime, endDt DateTime, loc Text ( 255 );
    SELECT DISTINCT a.[Region] AS Region, 
    Format(b.[Orderdate],"MMM-YY") AS MonthOrder, 
    (Select Count(CMet.[clientID]) as cnt  from 
    (SELECT distinct b.[orderID], Format(b.[order date],"MMM-YY") 
    as Contact_Month, a.[clientID], a.[Region]
    FROM Client as a 
    INNER JOIN orders AS b ON a.[client ID] = b.[client id]
    WHERE iif(isnull(loc),a.[REgion] like '*',instr (loc,a.[region]))
    and (b.[orderdate] between startDt and endDt)  
    and (a.[Start date] < startDt) 
    GROUP BY a.[Region], Format(b.[order date],"MMM-YY"), 
    a.[clientID], a.[Region]
    HAVING count(a.[clientID]) >=1) as CMet) AS Clients_Met, 
    (select count([client id]) from clients where 
    iif(isnull(loc),[region] like '*',instr (loc,[region])) and 
    client.[Start date] < startDt AS Total_Client, 
    (Total_Client-Clients_Met) AS Not_Met, 
    format(Clients_Met/iif(Total_Client =0,1,Total_Client),'##.##%') AS Met_Percentage
    FROM clients AS a 
    INNER JOIN orders AS b ON a.[client ID]=b.[client id]
    WHERE iif(isnull(loc),a.[region] like '*',instr (loc,a.[region]))
    and (a.[Start date] < startDt 
    GROUP BY a.[region], Format(b.[order date],"MMM-YY")
    HAVING count(a.[client id]) >=1
    ORDER BY a.[region];

最佳答案

我尝试了下面的解决方案。这个想法是在内部查询中进行分组,然后在外部查询中进行求和:

SELECT Region, Month, Count(ID) AS Clients, Sum(HasOrder) AS ClientsWithOrders, 
    [Clients]-[ClientsWithOrders] AS ClientsWithoutOrders
FROM (SELECT Region, CDate(Month([Order Date]) & "/1/" & Year([Order Date])) AS [Month], 
      ID, Max(IIf([Client ID]=[ID],1,0)) AS HasOrder
      FROM Orders, Client
      WHERE ((([Order Date])>=#5/1/2016# And 
          ([Order Date])<DateAdd("d",1,#7/31/2016#)))
      GROUP BY Region, CDate(Month([Order Date]) & "/1/" & Year([Order Date])), ID) 
         AS RegionMonthClient
GROUP BY Region, Month

困难在于我从你那里得到了不同的结果。例如,对于东部客户 (3,4),我看到一个有 5 月份的订单(客户 4),另一个有 7 月份的订单(客户 3)。

这种方法对您有用吗?

关于sql - 将 SQL 结果分组为 2 个子级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862889/

相关文章:

Python:将大型 SQL Server 查询结果导出到 .txt 文件

mysql - SQL:UNION 房地产优先优惠

ms-access - Access 查询错误 - 空和变体数据类型 - 如何修复此错误?

excel - 通过 GUI 脚本排序保存 SM37 行?

vb.net - 如何实例化 vba 类并调用 vb.net 中的方法?

sql - 将 select 方法与第一个方法组合返回错误 rails 4

sql - 将字符串添加到我的数据库行之一 - 为什么这不起作用?

ms-access - 更改记录源时自动设置 LinkChildFields 和 LinkMasterFields

vba - 使用 VBA Access 发送电子邮件时如何插入换行符

excel - 如何等待 Power Query 刷新完成?