1

毎日の訪問者数を格納するこのテーブルがあるとします。

テーブルをクエリしてそこからグラフを作成したい場合、問題が発生します。

活動のない日には、テーブルに対応する行がありません。

例えば

Day1 - 7
Day2 - 8
Day4 - 7

また、生成されたグラフは正しくありません。Day3 には 0 が必要なので。

では、SQL 以外のものを使用せずに、これらの非活動日の値を作成することは可能でしょうか?

スクリプトが実行されるたびに来る 30 日間のすべての日付を作成する別のテーブルを作成し、問題が修正されることを考えましたが、より実用的な解決策があるかどうか疑問に思っています。

前もって感謝します。

4

4 に答える 4

1

PostgreSQL 固有の関数を使用するため、この SQL のみとは呼びませんが、使用しているデータベースには似たようなものがあるかもしれません。

PostgreSQL には、generate_seriesという優れた機能があります。

この関数を使用して、一連の 30 日間を作成できます。

select current_date + s.a as dates from generate_series(0,30) as s(a);

 dates    
------------
 2010-04-22
 2010-04-23
 2010-04-24
 (.. etc ..)

次に、次のようなクエリでそれを使用できます。

select vpd.visits, temp.dates
  from (select current_date + s.a as dates from generate_series(0,30) as s(a)) as temp
 left outer join visits_per_day vpd on vpd.day = temp.dates

 visits |   dates    
--------+------------
     10 | 2010-04-22
        | 2010-04-23
     20 | 2010-04-24
        | 2010-04-25
        | 2010-04-26
     30 | 2010-04-27
于 2010-04-22T18:53:24.413 に答える
1

Sql Server 2005+ と CTE Recursive (共通テーブル式を使用) を使用して試すことができます

DECLARE @Table TABLE(
        DateVal DATETIME,
        Visists INT
)

INSERT INTO @Table SELECT '01 Jan 2010', 10
INSERT INTO @Table SELECT '03 Jan 2010', 1
INSERT INTO @Table SELECT '05 Jan 2010', 30
INSERT INTO @Table SELECT '10 Jan 2010', 50

;WITH MinMax AS (
        SELECT  MIN(DateVal) Startdate,
                MAX(DateVal) EndDate
        FROM    @Table
),
DateRange AS(
        SELECT  StartDate DateVal
        FROM    MinMax
        UNION ALL
        SELECT  DateRange.DateVal + 1
        FROM    DateRange,
                MinMax
        WHERE   DateRange.DateVal + 1 <= MinMax.EndDate
)
SELECT  DateRange.DateVal,
        ISNULL(t.Visists,0) TotalVisits
FROM    DateRange LEFT JOIN
        @Table t ON DateRange.DateVal = t.DateVal

出力として

DateVal                 TotalVisits
----------------------- -----------
2010-01-01 00:00:00.000 10
2010-01-02 00:00:00.000 0
2010-01-03 00:00:00.000 1
2010-01-04 00:00:00.000 0
2010-01-05 00:00:00.000 30
2010-01-06 00:00:00.000 0
2010-01-07 00:00:00.000 0
2010-01-08 00:00:00.000 0
2010-01-09 00:00:00.000 0
2010-01-10 00:00:00.000 50
于 2010-04-22T18:36:55.183 に答える
1

30 日でテーブルを作成するソリューションは、非常にシンプルで実用的なソリューションです。

本当にしたいのであれば、追加のテーブルなしでそれを行うことができますが、それは楽しいことではありません. SQL は実際には、データベースに存在しないデータを選択できるようには設計されていません。一般に、これを行うために複雑な SQL ステートメントを作成しようとするよりも、不足している行をクライアント側で追加する方がはるかに簡単な解決策です。

于 2010-04-22T18:26:21.693 に答える
0

いいえ、SQL のみを使用して不確定な数の不足している行を最初にテーブルに格納せずに SQL クエリの結果に追加する標準的な方法はありません。

アプリケーションが動作するすべての日付を含む単一のテーブルを作成するか、現在のクエリで使用する日付のみを格納するテーブルを作成することができます。2 番目の解決策を選択する場合は、異なるユーザーが異なる日付範囲で同じクエリを同時に実行できるように計画することを忘れないでください。DBMS でサポートされている場合は、テーブルを一時的なユーザー固有のものにする必要があります。

于 2010-04-22T18:35:12.017 に答える