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 按小时获取不同的客户计数的主要内容,如果未能解决你的问题,请参考以下文章