1

我有一个显示图表的报告。X 轴使用来自以下查询的日期。在查询没有返回日期的情况下,我得到了空白,并且更愿意返回一个值。有没有办法强制一个没有记录的日期?

SELECT
    DATE(instime),
    CASE
        WHEN direction = 1 AND duration > 0 THEN 'Incoming'
        WHEN direction = 2 THEN 'Outgoing'
        WHEN direction = 1 AND duration = 0 THEN 'Missed'
    END AS type,
    COUNT(*)
FROM taxticketitem
GROUP BY
    DATE(instime),
    CASE
        WHEN direction = 1 AND duration > 0 THEN 'Incoming'
        WHEN direction = 2 THEN 'Outgoing'
        WHEN direction = 1 AND duration = 0 THEN 'Missed'
    END
ORDER BY DATE(instime)
4

3 回答 3

1

一种可能的方法是创建一个日期表和LEFT JOIN你的表。该表可能如下所示:

CREATE TABLE `datelist` (
 `date` DATE NOT NULL,
 PRIMARY KEY (`date`)
);

并填写了从 Jan-01-2000 到 Dec-31-2050 之间的所有日期(这是我的日期生成器脚本)。

接下来,像这样编写您的查询:

SELECT datelist.date, COUNT(taxticketitem.id) AS c
FROM datelist
LEFT JOIN taxticketitem ON datelist.date = DATE(taxticketitem.instime)
WHERE datelist.date BETWEEN `2012-01-01` AND `2012-12-31`
GROUP BY datelist.date
ORDER BY datelist.date

LEFT JOIN并且从右表中计算非空值可确保计数正确(如果给定日期不存在行,则为 0)。

于 2013-01-15T10:54:33.393 回答
0

您需要为LEFT JOIN您的表格设置一组日期。不幸的是,MySQL 缺乏动态生成它的方法。

您需要准备一个表格,其中包含从 0 到 99999 的 100000 个连续整数(或者您认为您的最大报告范围是多长时间):

CREATE TABLE series (number INT NOT NULL PRIMARY KEY);

并像这样使用它:

SELECT  DATE(instime) AS r_date, CASE ... END AS type, COUNT(instime)
FROM    series s
LEFT JOIN
        taxticketitems ti
ON      ti.instime >= '2013-01-01' + INTERVAL number DAY
        AND ti.instime < '2013-01-01' + INTERVAL number + 1 DAY
WHERE   s.number <= DATEDIFF('2013-02-01', '2013-01-01')
GROUP BY
        r_date, type
于 2013-01-15T11:03:40.653 回答
0

以前必须做类似的事情。

您需要有一个子选择来生成日期范围。您想要的所有日期。将开始日期添加到数字中最简单:-

SELECT DATE_ADD(SomeStartDate, INTERVAL (a.I + b.1 * 10) DAY)
FROM integers a, integers b

给定一个名为 integers 的表,其中有一个名为 i 的列,其中 10 行包含 0 到 9,SQL 将为您提供从SomeStartDate开始的 100 天范围

然后,您可以将您的实际数据与该数据进行左连接以获得完整范围。

于 2013-01-15T11:09:32.147 回答