0

こんにちは、Oracle11gでのSQLクエリの呼び出しに問題があります。MySQLの下では正常に動作します。

SQLFIDDLEを見てください:

(SELECT IF(c.name IS NULL, '- Unknow -', c.name) as name,
    v.site,
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
    0  'isAll'
FROM violations v LEFT JOIN country c ON c.name = v.country
GROUP BY c.name, v.site)
union(
SELECT IF(c.name IS NULL, '- Unknow -', c.name) as name,
    '- All -',
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
  1  'isAll'
FROM violations v LEFT JOIN country c ON c.name = v.country
GROUP BY c.name)
UNION (
SELECT '- All -',
    '- All -',
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
    1  'isAll'
FROM violations v LEFT JOIN country c ON c.name = v.country)
ORDER BY name, isAll DESC, site

このコードの何が問題なのか分かりますか?

4

3 に答える 3

2

いくつか間違っていることがあります...

まず、IF()Oracleでは有効な構文ではありません。CASEステートメントに変更する必要があります。

次に、''を使用して列に名前を付けることはできません。したがって、「isAll」から「」を取り除く必要があります。

最後に、サイトで注文していますが、実際には列に名前を付けていません。

最終的なクエリは次のようになります。

(SELECT CASE WHEN c.name IS NULL THEN '- Unknow -' ELSE c.name END as name,
    v.site as site,
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
    0  isAll
FROM violations v LEFT JOIN country c ON c.name = v.country
GROUP BY c.name, v.site)
UNION (
SELECT CASE WHEN c.name IS NULL THEN '- Unknow -' ELSE c.name END as name,
    '- All -' as site,
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
  1  isAll
FROM violations v LEFT JOIN country c ON c.name = v.country
GROUP BY c.name )
UNION (
SELECT '- All -',
    '- All -' as site,
    SUM(CASE WHEN v.status_id = 1 THEN 1 ELSE 0 END) Total_SuspectedViolations,
    SUM(CASE WHEN v.status_id = 2 THEN 1 ELSE 0 END) Total_ConfirmedViolations,
    SUM(CASE WHEN v.status_id = 3 THEN 1 ELSE 0 END) Total_ConfirmedNoViolations,
    SUM(CASE WHEN v.status_id = 4 THEN 1 ELSE 0 END) Total_NotDetermined,
    COUNT(*) Total,
  1  isAll
FROM violations v LEFT JOIN country c ON c.name = v.country)
ORDER BY name, isAll DESC, site

このSQLFiddleでテストできます:http ://sqlfiddle.com/#!4 / 93c94 / 55

于 2013-03-12T20:04:16.520 に答える
1

グラントの答えに加えて、他のいくつかの最適化。

あなたは交換したいかもしれません:

 CASE WHEN c.name IS NULL THEN '- Unknow -' ELSE c.name END

と:

 Coalesce(c.name,'- Unknow -')

また、複数のレベルで集計しているため、より効率的でわかりにくい構文があります。GROUP BY ROLLUP()

Tim Hallは、高度なgroup-byトピックについて非常に優れた記事を掲載しています:http ://www.oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets.php

ROLLUPを使用しないことにした場合は、UNIONをUNION ALLに変更してください。UNIONには、ここでは何もしない暗黙の区別があります。

于 2013-03-12T20:11:33.127 に答える
1

実行される更新SQLFiddleは次のとおりです。それでも期待どおりの結果が得られることを確認してください。

于 2013-03-12T20:12:58.817 に答える