6

私は MS SQL Server を使用していますが、他のデータベースからの比較ソリューションを歓迎します。

これが私のクエリの基本的な形式です。「incidentsm1」テーブルから 1 日あたりの通話数を返します。

SELECT 
  COUNT(*) AS "Calls",
  MAX(open_time),
  open_day
FROM 
  (
SELECT
 incident_id,
 opened_by,
 open_time - (9.0/24) AS open_time,
 DATEPART(dd, (open_time-(9.0/24))) AS open_day
   FROM incidentsm1 
   WHERE 
 DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7

  ) inc1
GROUP BY open_day

このデータは棒グラフを描画するために使用されますが、特定の曜日に通話がなかった場合、結果の行が表示されず棒グラフも表示されず、ユーザーは「なぜグラフには 6 日しか表示されず、土曜日から月曜日にスキップしますか?」

どういうわけか、毎日の空白行などでUNION ALLを実行する必要がありますが、わかりません。

私は 1 つの SQL ステートメントでできることに制限されており、読み取り専用アクセス権を持っているため、一時テーブルなどを作成できません。

4

4 に答える 4

7

このようなものはどうですか?

SELECT 
  COUNT(incident_id) AS "Calls",
  MAX(open_time),
  days.open_day
FROM
(
  select datepart(dd,dateadd(day,-6,getdate())) as open_day union
  select datepart(dd,dateadd(day,-5,getdate())) as open_day union
  select datepart(dd,dateadd(day,-4,getdate())) as open_day union
  select datepart(dd,dateadd(day,-3,getdate())) as open_day union
  select datepart(dd,dateadd(day,-2,getdate())) as open_day union
  select datepart(dd,dateadd(day,-1,getdate())) as open_day union
  select datepart(dd,dateadd(day, 0,getdate())) as open_day 
) days
left join 
(
 SELECT
   incident_id,
   opened_by,
   open_time - (9.0/24) AS open_time,
   DATEPART(dd, (open_time-(9.0/24))) AS open_day
 FROM incidentsm1 
 WHERE DATEDIFF(DAY, open_time-(9.0/24), GETDATE()) < 7
) inc1 ON days.open_day = incidents.open_day
GROUP BY days.open_day

単純化されたテーブル スキーマでのみテストしましたが、動作するはずです。あなたはdateaddのものをいじる必要があるかもしれません..

于 2009-02-27T03:28:27.500 に答える
0

クエリの一部として日付のセットを作成できますか?次のようなもの:

SELECT COUNT(*) AS Calls, ...
    FROM incidentsm1 RIGHT OUTER JOIN
         (SELECT date_values
            FROM TABLE(('27 Feb 2009'), ('28 Feb 2009'), ('1 Mar 2009'),
                       ('2 Mar 2009'), ('3 Mar 2009'), ('4 Mar 2009'),
                       ('5 Mar 2009')) AS date_list
         )
         ON ...

これは、InformixとDB2の表記法の一種のハイブリッドに触発されており、両方で構文的に正しくないことがほぼ保証されています。基本的に、DBMSにリテラルテーブルをその場で作成する方法はありますか。1つの可能性(醜いがほとんど実行できない)は、「dual」または1行を保証するテーブル式(Informix用語ではSELECT MDY(2,28,2009) FROM "informix".systables WHERE tabid = 1 UNION ...)から選択された日付リテラルの7ウェイUNIONを実行することです。

于 2009-02-27T01:36:09.830 に答える
0

必要な日付を含むテーブル変数を作成して、そのRIGHT JOIN上に置くことはできますか? 例えば、

DECLARE @dateTable TABLE ([date] SMALLDATETIME)

INSERT INTO @dateTable
VALUES('26 FEB 2009')
INSERT INTO @dateTable
VALUES('27 FEB 2009')
-- etc

SELECT 
  COUNT(*) AS "Calls",
  MAX(open_time),
  open_day
FROM 
  (
SELECT
 incident_id,
 opened_by,
 open_time - (9.0/24) AS open_time,
 DATEPART(dd, (open_time-(9.0/24))) AS open_day
   FROM incidentsm1
   RIGHT JOIN @dateTable dates
   ON incidentsm1.open_day = dates.date
   WHERE 
 DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7

  ) inc1
GROUP BY open_day

ただし、より理想的な状況は、日付を含むテーブル オブジェクトを使用することです。

于 2009-02-26T23:44:31.970 に答える
0

日付テーブルの使用をお勧めします。既存の日付テーブルが配置されている場合、日付テーブルに対して RIGHT OUTER JOIN を実行して、欠落している日を取り込むことができます。

于 2009-02-26T23:48:43.317 に答える