質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • SQL

    2324questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    572questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

グループバイ 0件を表示・・・

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 733

AT_WORK24

score 2

SELECT CONVERT(NVARCHAR, 日付項目, 111) AS 日, 
DATEPART (hour, 日付項目) AS 時間,
COUNT(*) AS 件数
FROM テーブル名
WHERE   
条件1= XXXX
AND 日付項目 >= '2017/X/X 00:00:00'
AND 日付項目 < '2017/X/X 00:00:00'
GROUP BY CONVERT(NVARCHAR, 日付項目, 111),
DATEPART (hour, 日付項目)
ORDER BY 日,時間

上記SQLにて1時間ごとの件数をカウントしようと考えています。
GROUP BYをして0件の時もレコードを表示したい場合には、
どのように修正するのが、最もきれいな記述法でしょうか。

※時間帯のマスタはありません。
※環境上、SQL Severに新規でストアドやマスタを作成することはできません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

※時間帯のマスタはありません。

まさに時間帯マスタをつくって結果をjoinすればよいだけだと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

再帰的な共通表式 (CTE) で連続データの一時表を作って外部結合します

【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。

WITH cte (
    dt
) AS (
    SELECT CAST('2017-xx-xx 00:00:00' AS datetime) AS dt
    UNION ALL
    SELECT DATEADD(hour, 1, cte.dt)
    FROM cte
    WHERE cte.dt < '2017-yy-yy 00:00:00'
)
SELECT
    CONVERT (NVARCHAR, cte.dt, 111) AS 日
    ,DATEPART (hour, cte.dt) AS 時間
    ,COUNT(t.日付項目) AS 件数
FROM
    cte
    LEFT OUTER JOIN テーブル名 AS t
        ON CONVERT(NVARCHAR, cte.dt, 111) = CONVERT(NVARCHAR, t.日付項目, 111)
        AND DATEPART(hour, cte.dt) = DATEPART(hour, t.日付項目)
        AND t.条件1 = xxxx
GROUP BY
    CONVERT(NVARCHAR, cte.dt, 111)
    ,DATEPART(hour, cte.dt)
ORDER BY
    日
    ,時間
OPTION (MAXRECURSION 0)  

※テストしてないので文法エラーがあるかも

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 13:38 編集

    おお、再帰ですか。確かにこれは思いつかなかった。流石です。
    試してみました(CTE部分だけ)、ちょっとエラーがありますね。
    cast() とOPTION (MAXRECURSION)です。

    WITH cte (dt) AS (
    SELECT cast('2017-01-01 00:00:00' as datetime) AS dt
    UNION ALL
    SELECT DATEADD(hour, 1, cte.dt) FROM cte
    WHERE cte.dt < '2018-01-01 00:00:00'
    )
    select * from cte OPTION (MAXRECURSION 0)

    後、CTEで条件の期間とすれば、本文のwhere条件は不要ですね。

    キャンセル

  • 2017/09/08 14:06

    元記事は結構古いですね。sqlserverは触ってなかったからなー。
    増分の間隔なども調整できそうですし、これはかなり使えますね。
    mysqlも8.0からは再帰に対応するそうですし、応用できますね。

    キャンセル

  • 2017/09/08 19:39

    指摘ありがとうございます。修正しました。

    キャンセル

0

SQLServerにGENERATE_SERIES()があれば最も綺麗な記述になります。

でも無いので、こちら(SQL Server TVF(テーブル値関数)-連続生成関数-)のストアドをお借りすると、以下で基準となる期間が生成できます。

select DATEADD(hour, 時数.num, DATEADD(day, 日数.num, [条件開始日付])) as 日付  
from GENERATE_SERIES(0, [条件日数], 1) as 日数 , GENERATE_SERIES(0, 23, 1) as 時数
-- ※[条件開始日付]:抽出条件の開始の日付、[条件日数]:抽出条件の日付の差(終了日-開始日-1)


後は、上記を基準に外部結合や相関問合せなどで求めれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2324questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    572questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。