获取GROUP BY的“填充”空值

时间:2018-12-31 12:13:21

标签: mysql sql

假设我想从一个日期范围中获取“每周”结果,并且该日期范围包含四个单独的星期,但是我的数据库只有一个星期的记录,我如何才能获取剩余三个星期的填充值? / p>

例如,给定此日期范围:6/2018-7/2018

我运行以下查询:

SELECT
 DATE_FORMAT(period, '%m %d') || ' - ' || DATE_FORMAT(period, '%m %d') AS period,
 SUM(clicks) AS clicks
FROM tablename
WHERE period >= ? AND period <= ?
GROUP BY YEAR(period), WEEK(period)

数据库中有这些表行:

|         period          | clicks |
|  07/01/2018T:00:00:00Z  |  1000  | 

我得到这些查询结果:

|     period      | clicks |
|  Jul 1 - Jul 5  |  1000  | 

但是我想获得这些查询结果以覆盖空周的默认值,因此我可以使用它们来填充d3图表:

|     period      | clicks |
|  Jul 1 - Jul 5  |  1000  | 
| Jun 25 - Jun 23 |  0     |
| Jun 18 - Jun 24 |  0     |
| Jun 12 - Jun 18 |  0     |

有什么想法吗?这种“填充”现象应具有足够的通用性,可以与其他间隔(例如每天,每月,每年,每小时)一起使用。

2 个答案:

答案 0 :(得分:0)

将查询重写为

ifnull( SUM(clicks),0) AS clicks

答案 1 :(得分:0)

您可以使用此查询生成星期数,然后将其与当前查询左联接以获得所需的内容。

DECLARE @StartingFromDate DATETIME = '2018-12-01';
DECLARE @EndingAtDate DATETIME = '2018-12-31';

WITH CTE_DateRange (DateRange)
    AS (SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, @EndingAtDate) - DATEDIFF(WEEK, @StartingFromDate, @EndingAtDate), 0)
        UNION ALL
        SELECT DATEADD(WEEK, 1, DateRange)
        FROM CTE_DateRange
        WHERE DATEADD(WEEK, 1, DateRange) < @EndingAtDate)
SELECT CTE_DateRange.DateRange
FROM CTE_DateRange
WHERE CTE_DateRange.DateRange BETWEEN @StartingFromDate AND @EndingAtDate