sql >> データベース >  >> RDS >> Sqlserver

ゼロ値を含む SQL カウント

    WHERE 句ではなく、GROUP BY です。クエリは、存在する行のデータのみを返します。つまり、タイムスタンプの日付でグループ化すると、行がある日だけが返されます。 SQL Server は、"空白を埋める" 必要があることをコンテキストから知ることができません。また、何を使用しているかもわかりません。

    通常の答えは、表示したいすべての日を生成する CTE であり、空白を埋めます。これは再帰的な SQL ステートメントを必要とするため少しトリッキーですが、よく知られたトリックです:

    WITH CTE_Dates AS
    (
        SELECT @START AS cte_date
        UNION ALL
        SELECT DATEADD(DAY, 1, cte_date)
        FROM CTE_Dates
        WHERE DATEADD(DAY, 1, cte_date) <= @END
    )
    SELECT
    cte_date as TIME_STAMP,
    ISNULL(COUNT(HL_Logs.Time_Stamp), 0) AS counted_leads, 
    FROM CTE_Dates
    LEFT JOIN HL_Logs ON DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)) = cte_date
    WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
    GROUP BY cte_date
      

    分解すると、CTE は自分自身を参照する共用体を使用して、一度に 1 日ずつ前の日付に再帰的に追加し、その日付をテーブルの一部として記憶します。 CTE を使用して * を選択した単純なステートメントを実行すると、開始と終了の間の日付のリストが表示されます。次に、このステートメントは、ログ タイムスタンプの日付に基づいて、この日付のリストをログ テーブルに結合しますが、左結合を使用してログ エントリを持たない日付を保持します ("右側かどうか)。最後に、代わりに日付とカウントでグループ化し、必要な回答を得る必要があります。



    1. 致命的なエラー:特権テーブルを開いてロックできません:テーブル'mysql.host'が存在しません

    2. PHP、MySQL、PDO-UPDATEクエリから結果を取得しますか?

    3. 結果がない場合でも、その間のすべての日付を表示する

    4. アセットフォルダからデータベースを読み取る