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

考えられる 1 つの方法は、日付LEFT JOINのテーブルとそれらを含むテーブルを作成することです。テーブルは次のようになります。

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

2000 年 1 月 1 日から 2050 年 12 月 31 日までのすべての日付で埋められます (これが私のDate Generator スクリプトです)。

次に、次のようにクエリを記述します。

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また、右側のテーブルから null 以外の値をカウントすることで、カウントが正しいことが保証されます (特定の日付に行が存在しない場合は 0)。

于 2013-01-15T10:54:33.393 に答える
0

以前に似たようなことをしなければなりませんでした。

日付の範囲を生成するには、副選択が必要です。あなたが望むすべての日付。数字に開始日を追加するのが最も簡単です:-

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

0 から 9 を含む 10 行の i という単一の列を持つ integers というテーブルがあると、SQL はSomeStartDateから始まる 100 日の範囲を提供します。

次に、実際のデータをそれに対して左結合して、全範囲を取得できます。

于 2013-01-15T11:09:32.147 に答える
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 に答える