2012-01-18 14 views
0

私はウェブ上を見てきましたが、私の問題の答えを見つけられませんでした。私が見つけた最も近いのはStackOverflowのthisでした。グループと統計情報をまとめて照会する

私は、ステータスが異なるトランザクションを持っています。私はすべてのトランザクションをそのステータスに従って要約するクエリをコンパイルしようとしています。私はGroup Byで簡単にそれを行うことができますが、私が必要とすることはできません。特定のステータスの2つを合計することです。例:

Status 
-------- 
Status_A 
Status_B 
Status_C_D 
Status_C 
Status_D 
Status_E 

上記のStatus_C_Dは、Status_CとStatus_Dの合計になります。ステータスCはトランザクションエラーの一種であり、Status_Dは別の種類のエラーであるため、両方の合計でエラーのあるトランザクションの合計を簡単に確認できます(すべてがレポートに表示されます)。私が持っているものはこれです:

SELECT DECODE(STATUS_CD, 
     0, 'Status_A', 
     1, 'Status_B', 
     2, 'Status_C', 
     3, 'Status_D', 
     4, 'Status_E', 
     'Unknown') status 
FROM table_a ... 

うまくいけば十分な文脈です。どんな助けでも大歓迎です。 :)

select decode(TABLE_A.status_cd, 0, 'Status A', 
           1, 'Status B', 
           2, 'Status C', 
           3, 'Status D', 
           4, 'Status E', 
           'Unknown') status, 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) +8)/8), 1, 1, 0)) "0-7", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) +8)/8), 2, 1, 0)) "8-15", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) +8)/8), 3, 1, 0)) "16-23", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) +9)/8), 4, 1, 0)) "24-30", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) -1)/30), 1, 1, 0)) "31-60", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) -1)/30), 2, 1, 0)) "61-90", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) -1)/30), 3, 1, 0)) "91-120", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time) -1)/60), 2, 1, 0)) "121-180", 
     SUM(decode(trunc(((sysdate - TABLE_A.date_time))/181), 0, 0, 1)) ">180" 
FROM Table_A 
WHERE ... 
GROUP BY TABLE_A.status_cd 
+0

Oracle 11gのネイティブPIVOT演算子をサポートしています。 –

+0

私たちは10gを使用しています。私が知っている限り、もう数年は切り替えることはありません。ありがとう。 –

答えて

0

ページ全体でこれらの要約を見て満足していると仮定すると、これを実行する最も簡単な方法は、次のようになります。

select sum(DECODE(STATUS_CD, 0,1, 0)) Status_A, 
     sum(DECODE(STATUS_CD, 1,1, 0)) Status_B, 
     sum(DECODE(STATUS_CD, 2,1, 3,1, 0)) Status_C_D, 
     sum(DECODE(STATUS_CD, 2,1, 0)) Status_C, 
     sum(DECODE(STATUS_CD, 3,1, 0)) Status_D, 
     sum(DECODE(STATUS_CD, 4,1, 0)) Status_E 
FROM table_a ... 

EDIT:あなたは、ページの下の結果を確認する必要がある場合は、試してみてください。

select "status", 
     SUM(decode(trunc(((sysdate - "date_time") +8)/8), 1, 1, 0)) "0-7", 
     SUM(decode(trunc(((sysdate - "date_time") +8)/8), 2, 1, 0)) "8-15", 
     SUM(decode(trunc(((sysdate - "date_time") +8)/8), 3, 1, 0)) "16-23", 
     SUM(decode(trunc(((sysdate - "date_time") +9)/8), 4, 1, 0)) "24-30", 
     SUM(decode(trunc(((sysdate - "date_time") -1)/30), 1, 1, 0)) "31-60", 
     SUM(decode(trunc(((sysdate - "date_time") -1)/30), 2, 1, 0)) "61-90", 
     SUM(decode(trunc(((sysdate - "date_time") -1)/30), 3, 1, 0)) "91-120", 
     SUM(decode(trunc(((sysdate - "date_time") -1)/60), 2, 1, 0)) "121-180", 
     SUM(decode(trunc(((sysdate - "date_time"))/181), 0, 0, 1)) ">180" 
from 
(SELECT DECODE(coalesce(d.dummy_status, a.STATUS_CD), 
     'X', 'Status_C_D' 
     '0', 'Status_A', 
     '1', 'Status_B', 
     '2', 'Status_C', 
     '3', 'Status_D', 
     '4', 'Status_E', 
     'Unknown') "status", 
     a."date_time" 
FROM table_a a 
LEFT JOIN (select '2' status_cd, '2' dummy_status from dual union 
      select '2' status_cd, 'X' dummy_status from dual union 
      select '3' status_cd, '3' dummy_status from dual union 
      select '3' status_cd, 'X' dummy_status from dual) d 
     ON a.status_cd = d.status_cd 
... 
) group by "status" 
+0

これは私にX軸のすべてのステータスを与えるので、まあまあではありません。要約レコードとしてY軸にそれらのステータスが必要です。しかし、ありがとう! –

+0

@Mo_Joe:結果をページの下に返すクエリを含めるように答えを修正しました。 –

+0

さて、私はこれを試し、結果を投稿します。 –

0
SELECT Status, SUM(other_column) AS other_sum 
FROM 
    (SELECT 
     CASE WHEN STATUS_CD = 'Status_C' OR STATUS_CD = 'Status_D' 
      THEN 'Status_C_D' 
      ELSE STATUS_CD 
     END AS Status, 
     other_column 
    FROM 
     table_a) A 
GROUP BY 
    Status 

EDIT:Oで試してみてくださいNLY少しあなたのDECODEを変更:

SELECT status, SUM(other_column) AS other_sum 
FROM 
    (SELECT 
     DECODE(STATUS_CD, 
       0, 'Status_A', 
       1, 'Status_B', 
       2, 'Status_C_D', 
       3, 'Status_C_D', 
       4, 'Status_E', 
       'Unknown') status, 
     other_column 
    FROM 
     table_a) A 
GROUP BY 
    status 

STATUS_CD 2と3は現在、同じテキスト「Status_C_D」を生成し、対応するピボットテーブル内の単一の列になります。

(STATUS_CDがテキストに変換数、であるので、私の最初のコードexmampleは、間違っていた。)

+0

しかし、これはまだ私に2つの列を与えませんか?私はそれを試して、返信します。ありがとう。 –

+0

"Status_C"と "Status_D"は新しいステータスコード "Status_C_D"に置き換えられ、ピボットされると1つの列が生成されます。 –

+0

最後に編集しましたが、status_cとstatus_dは表示されません(また、個別に表示したい場合もあります)。私は自分の投稿を編集し、それが役に立ったかどうかを調べるためにクエリ全体を含める。本当にありがとう! –

関連する問題