【问题标题】:SQL: trying to get unrecorded dates [duplicate]SQL:试图获取未记录的日期[重复]
【发布时间】:2019-01-14 09:12:13
【问题描述】:

那天我有一张包含(日期和订阅者)的表格,有些日子我的服务会有新订阅者。我写了一个查询,让我知道每天新订户的数量(计数)。但是有些日子,没有新订阅者,这些天根本没有显示(没有新订阅者 = 没有记录)。我希望他们显示,并且我希望没有新订阅者的记录显示有 0 个新订阅者。

例如订阅者表:

Date        Subscribers
03-08-2018   a,b
04-08-2018   a,b,c
05-08-2018   a,c,d
06-08-2018   a,
07-08-2018   a,e,g,k,l

我得到的桌子:

Date          New_Subs
03-08-2018      2
04-08-2018      1
05-08-2018      1
07-08-2018      4

我应该得到:

Date          New_Subs
03-08-2018      2
04-08-2018      1
05-08-2018      1
06-08-2018      0
07-08-2018      4

P.S 我使用函数 min(date) 获取新的 subs 以获取它在数据库中显示的第一个日期

SELECT count(*) Subscribers , convert(varchar, creatingdate, 23)
FROM Payments p
JOIN
(SELECT msisdn , Min(creatingdate) AS day
FROM Payments p
GROUP BY MSISDN) groupedtt 
ON p.MSISDN = groupedtt.MSISDN 
AND p.CreatingDate = groupedtt.day
group by convert(varchar, creatingdate, 23)
order by convert(varchar, creatingdate, 23)

【问题讨论】:

  • 这似乎是一种日历之类的东西。您有一个包含所有日期的日期表,并且您将数据加入其中,这样即使您没有特定日期的任何数据,也会返回您想要的所有日期。
  • 这是一个常见问题。我希望我能在 SO 上找到一个很好的示例问题。正如已经提到的,您首先需要一个 calendar 表(谷歌它),然后您需要外部加入它。这是一个示例:dba.stackexchange.com/questions/75473/…

标签: sql sql-server database join subquery


【解决方案1】:

您可以使用master..spt_values。使用 Type = 'P' 查询它会得到从 0 到 2047 的数字。使用 DATEADD(DAY, -1 * master..sp_values.number, GETDATE()) 会得到最后 2048 个日期。您可以使用此表开始您的选择,并使用与订阅者表的左连接来获取所有订阅者。在那之后,对于那些什么都没有的日子,COUNT 也将返回 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多