1

レポートデータを取得しようとしています

これは私のクエリです:

SELECT sourceCode as "Source", to_char(myTimestamp, 'YYYY-MM-DD') as "Date", statusCode as "Status", count(*) as "Count"
FROM archive_table
WHERE myTimestamp BETWEEN TO_TIMESTAMP('2013-09-30','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-05','yyyy-mm-dd')
GROUP BY sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode
ORDER BY 1, 2, 3

これは出力です:

Source  Date    Status  Count
Source1 9/30/2013   C   10
Source1 10/1/2013   C   8
Source1 10/2/2013   C   24
Source1 10/2/2013   O   4
Source2 10/4/2013   C   22
Source2 10/4/2013   O   7
Source3 10/1/2013   C   2
Source4 9/30/2013   C   15
Source4 9/30/2013   O   15
Source4 10/1/2013   C   24
Source4 10/1/2013   O   12

私が見たいのは、すべてのカウントが 0 であることです。たとえば、2013 年 9 月 30 日の日付の Source1 にはデータベースにステータス 0 がないため、表示したいと思います。

Source1  9/30/2013  O  0

別の例として、2013 年 9 月 30 日の時点で Source2 が存在するため、次のように表示されます。

Source2  9/30/2013  O  0
Source2  9/30/2013  C  0

これを行う簡単な方法があることを願っています。追加情報として、「ソース」は 4 つしかなく、ステータスは「O」または「C」のいずれかです。もちろん、日付範囲は where 句で提供されます。

4

2 に答える 2

2

簡単に参照できる SQL Fiddle

これを行う最も簡単な方法は、可能なソース、ステータス、および日付を含む値のテーブルがある場合です。そうしない場合でも、クエリをサポートできる派生テーブルをオンザフライで生成できます。

これにより、クエリしようとしているソース、ステータス、および日付のすべての組み合わせが生成されます。

select
  *
from
  (select 'Source1' Source from Dual
   union select 'Source2' from Dual
   union select 'Source3' from Dual
   union select 'Source4' from Dual
   ) s
  cross join (
    select 'O' Status from Dual
    union select 'C' from Dual
   ) c
  cross join (
    select '2013-09-30' Dt from Dual
    union select '2013-10-01' from Dual
    union select '2013-10-02' from Dual
    union select '2013-10-03' from Dual
    union select '2013-10-04' from Dual
    union select '2013-10-05' from Dual
   ) d;

次に、このすべてを取り、archive_table に左結合し、ベース テーブルではなく作成されたデータでグループ化を行い、archive_table 列の 1 つをカウントします。

select
  s.Source,
  c.Status,
  d.Dt,
  count(t.Source)
from
  (select 'Source1' Source from Dual
   union select 'Source2' from Dual
   union select 'Source3' from Dual
   union select 'Source4' from Dual
   ) s
  cross join (
    select 'O' Status from Dual
    union select 'C' from Dual
   ) c
  cross join (
    select '2013-09-30' Dt from Dual
    union select '2013-10-01' from Dual
    union select '2013-10-02' from Dual
    union select '2013-10-03' from Dual
    union select '2013-10-04' from Dual
    union select '2013-10-05' from Dual
   ) d
  left join test t
    on s.Source = t.Source
       and c.Status = t.Status
       and d.Dt = t.Dt
group by
  s.Source,
  c.Status,
  d.Dt
于 2013-10-11T03:12:19.233 に答える
1

日付範囲内の各日付を指定するのではなく、次のように指定すると、開始日と終了日のみを含める必要があります。

SELECT
    TO_DATE('09/30/2013','mm/dd/yyyy') - 1 + LEVEL dt
FROM dual
    CONNECT BY
LEVEL <= ( TO_DATE('10/05/2013','mm/dd/yyyy')
         - TO_DATE('09/30/2013','mm/dd/yyyy')) + 1
于 2013-10-11T04:56:01.920 に答える