2

問題

埋める必要のあるデータギャップがあります。避けたい、UNIONまたはPARTITION BY可能であれば。

クエリステートメント

selectステートメントは次のようになります。

SELECT
  count( r.incident_id ) AS incident_tally,
  r.severity_cd,
  r.incident_typ_cd
FROM
  report_vw r
GROUP BY
  r.severity_cd, r.incident_typ_cd
ORDER BY
  r.severity_cd,
  r.incident_typ_cd

データソース

重大度コードとインシデントタイプコードは次のものからのものです。

  • severity_vw
  • incident_type_vw

列は次のとおりです。

  • Incident_tally
  • 重大度_cd
  • Incident_typ_cd

実際の結果データ

36  0   ENVIRONMENT
1   1   DISASTER
27  1   ENVIRONMENT
4   2   SAFETY
1   3   SAFETY

必要な結果データ

36  0   ENVIRONMENT
0   0   DISASTER
0   0   SAFETY
27  1   ENVIRONMENT
0   1   DISASTER
0   1   SAFETY
0   2   ENVIRONMENT
0   2   DISASTER
4   2   SAFETY
0   3   ENVIRONMENT
0   3   DISASTER
1   3   SAFETY

質問

UNION、、PARTITION BYまたはをどのように使用LEFT JOINしてゼロカウントを入力しますか?

4

3 に答える 3

3

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

SELECT  COUNT(r.incident_id),
        crsjn.severity_cd,
        crsjn.incident_typ_cd
FROM    (
            SELECT  severity_cd,
                    incident_typ_cd
            FROM    severity_vw,
                    incident_type_vw
        ) crsjn LEFT JOIN
        report_vw r     ON  crsjn.severity_cd = r.severity_cd 
                        AND crsjn.incident_typ_cd = r.incident_typ_cd
GROUP BY crsjn.severity_cd,
        crsjn.incident_typ_cd
ORDER BY crsjn.severity_cd,
        crsjn.incident_typ_cd
于 2010-03-29T20:06:59.433 に答える
1

最も簡単なのは、別のテーブルにインシデントの種類と重大度がある場合です。

SELECT COALESCE(sub.incident_tally), s.severity_cd, i.incident_type_cd
FROM incident_type i
CROSS JOIN incident_severity s
LEFT JOIN (
   ... your original sql statement...
) sub ON i.incident_typ_cd = sub.incident_type_cd
  AND s.severity_cd = sub.severity_cd

そして、もしあなたがそれらのテーブルを持っていなかったら、あなたはこのようなことをすることができます。UNIONの制限がない理由がわかりません。しかし、これは機能します。

CREATE TYPE VARCHAR_TABLE AS TABLE OF VARCHAR2(60);
CREATE TYPE NUMBER_TABLE AS TABLE OF NUMBER;

WITH inc AS (
  SELECT /*+ CARDINALITY(nt1 3) */ column_value AS incident_type_cd
  FROM TABLE(varchar_table('ENVIRONMENT', 'DISASTER', 'SAFETY')) nt1
),
sev AS (
  SELECT /*+ CARDINALITY(nt2 4) */ column_value AS severity_cd
  FROM TABLE(number_table(0,1,2,3)) nt2
) 
SELECT *
FROM inc
CROSS JOIN sev
LEFT JOIN (
   ... your original sql statement...
) sub ON i.incident_typ_cd = sub.incident_type_cd
  AND s.severity_cd = sub.severity_cd

4

于 2010-03-29T20:05:36.593 に答える
0

私が考えることができる唯一の方法は、そのテーブルをさらに正規化し、左結合を使用することです。

于 2010-03-29T20:05:09.637 に答える