假设我想从一个日期范围中获取“每周”结果,并且该日期范围包含四个单独的星期,但是我的数据库只有一个星期的记录,我如何才能获取剩余三个星期的填充值? / 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 |
有什么想法吗?这种“填充”现象应具有足够的通用性,可以与其他间隔(例如每天,每月,每年,每小时)一起使用。
答案 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