【问题标题】:How can I cross join the following query results with a table of dates如何将以下查询结果与日期表交叉连接
【发布时间】:2015-08-25 22:45:58
【问题描述】:

我正在寻找一个查询,它可以提供我每天的游戏时间。开始 (first_date) 和结束日期 (last_update) 如表所示。以下查询为我提供了给定日期的播放时间总和。如何扩展它以获取从第一天到最后一天的表格并在其中绘制查询数据并在没有玩游戏的日期显示 0。

SELECT startTime, SUM(duration) as sum
FROM myTable
WHERE startTime = endTime
GROUP BY startTime

【问题讨论】:

  • 您的查询似乎与您声称的不符。
  • 我编辑了我的问题,现在更清楚了吗?

标签: sql sql-server sql-server-2008


【解决方案1】:

要显示没有人玩的日期,您需要创建一个带有date 字段day 的表格days,以便您可以使用left join。 (100 年只有 36500 行)。

使用选择Generate days from date range

这使用MSQL中的存储过程

我会假设如果一出戏过了午夜就会开始一个新的记录。所以我可以简化我的代码并从datetime 字段中删除时间

SELECT d.day, SUM(duration) as sum
FROM 
    days d
    left join myTable m
         on CONVERT(date, m.starttime) = d.day
GROUP BY d.day

【讨论】:

  • 我是 sql server 新手,您能帮我完成查询吗?
  • 什么部分?如果游戏通过午夜,我的假设是如何创建的?
  • 很遗憾,没有标记午夜。所以如果一场比赛从晚上 11 点开始,那么它可能会在凌晨 1 点结束。天必须手动计算。部分)在查询中获取日期表
  • 您需要帮助的部分是什么?你能为我准备一个带有你的数据的小SQLFiddle 吗?我尝试在今天晚些时候编写您需要的查询
  • @Jakar 我只是给他选项。但是你是对的,创建表是最好的表现。我说一个表中的 35000 行只是几美分。
【解决方案2】:

如果我理解正确,你可以试试:

SELECT SUM(duration) AS duration, date
FROM myTable
WHERE date <= 20140430 
    AND date => 20140401
GROUP BY date

这将获得 4 月 1 日至 4 月 30 日之间每个日期的总播放时间
至于显示0 的日期不在表格中,我不知道。

另外,您发布的表格没有显示duration 列,但您发布的查询显示,所以我继续使用它。

【讨论】:

  • 图片已更新。是的,但我想显示所有日期和 0 表示没有玩游戏的日期。
猜你喜欢
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
相关资源
最近更新 更多