SQL 按小时获取不同的客户计数

Posted

技术标签:

【中文标题】SQL 按小时获取不同的客户计数【英文标题】:SQL get distinct customer count by hour 【发布时间】:2020-03-30 16:13:32 【问题描述】:

我有两个带有 datein 和 timein 的表格,在下订单时记录,另一个表格带有 datepicked 和 timepicked 列,在提取订单发票时记录。我需要找出每小时有多少客户,但有些人在下订单,有些人在取发票,有些人两者都做。在同一天/同一小时内,同一客户可能有多个订单和发票。

OrderTable:
Ordernum
CustomerID
datein
timein

InvoiceTable:
CustomerID
InvoiceID
Ordernum
datepicked
timepicked 

我尝试了这个 SQL,但我找不到如何从两个表中获取 DISTINCT CUSTOMERID 以及两个表上排列的日期和时间,我在结果中注意到如果一小时/天没有订单列没有排列。

Select o.datein, i.datepicked, (o.datein) As iDay, HOUR(o.timein) as iH,
DayOfMonth(i.datepicked) As pDay, HOUR(i.timepicked) as pH, Count(*) as Total
from OrderTable o, InvoiceTable i
Where
o.datein >= '2019-01-01' and o.datein <= '2019-12-31'
GROUP BY o.datein, i.datepicked, iDay, iH, pDay, pH

感谢您的帮助。 金

【问题讨论】:

如果我是专家,我不会寻求帮助。 【参考方案1】:

不知道为什么要按原样设置表格,但如果您真正关心的是每个日期/小时的 DISTINCT 客户,我会通过仅预先合并这些记录来执行以下操作,然后从中区分计数。如果交易是在不同时间完成的,不要担心加入,除非您考虑的是订单和发票都在同一小时内处理。如果一个订单在 10:59 完成,而发票是 11:00,仅相隔 1 分钟,但代表 2 个不同的小时,会发生什么情况。在每个单独的小时部分中出现的将是同一位客户。

请注意,第一个“FROM”子句有一个联合,用于将所有记录获取到相同列名的大量记录,每个记录都有各自的 2019 日历活动日期。完成后,为 COUNT DISTINCT 客户获取和分组。

select
        AllRecs.DateIn,
        hour( AllRecs.TimeIn ) ByHour,
        DayOfMonth(AllRecs.DateIn) pDay, 
        Count( distinct AllRecs.CustomerID ) UniqueCustomers
    from
    ( select 
            ot.CustomerID, 
            ot.datein, 
            ot.timein
        from 
            OrderTable ot
        where
                ot.datein >= '2019-01-01' 
            and ot.datein <= '2019-12-31'
      union all
      select 
            it.CustomerID, 
            it.datepicked datein, 
            it.timepicked timein
        from 
            InvoiceTable it
        where
                it.datepicked >= '2019-01-01' 
            and it.datepicked <= '2019-12-31' ) AllRecs
    group by
        AllRecs.DateIn,
        hour( AllRecs.TimeIn ),
        DayOfMonth(AllRecs.DateIn)

【讨论】:

谢谢,刚从隔离区出来。每天学习有关 SQL 的新知识。【参考方案2】:

如果您在这两个表之间有关系,那将是可能的。如果我了解您要执行的操作,则 InvoiceTable 需要是 OrderTable 的子表,其外键字段“OrderNum”与其父“OrderTable”主键“OrderNum”相关。因此,您不需要 InvoiceTable 上的“CusotmerID”字段,并且您会知道提取的发票何时属于同一天的订单。

【讨论】:

嗨 Reinaldo,我在 InvoiceTable 中有 Ordernum。我只是编辑我的问题。希望你一切顺利。

以上是关于SQL 按小时获取不同的客户计数的主要内容,如果未能解决你的问题,请参考以下文章

从访问数据库中按年份获取不同的计数

SQL:按条件从不同表中按计数排序

用于获取不同日期以及唯一计数最大值的大查询

sql 按计数获取日期的博客存档格式,并按月/年分组

用于计数和显示(列中的不同值)的 Sql 查询优化,按其他两列分组

vb.net datatable asenumerable 获取不同的值并按重复行计数组