Запрос на обобщение статистики с помощью группы по - PullRequest
0 голосов
/ 18 января 2012

Я просматривал Интернет, но не нашел ответа на свою проблему.Самым близким, что я нашел, был этот также из StackOverflow.

Так что у меня есть транзакции с различными статусами.Я пытаюсь скомпилировать запрос, который будет суммировать все транзакции в соответствии с их статусом.Я легко могу сделать это с помощью Group By, но мне нужно и не нужно суммировать два из определенных статусов.Например:

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

Ответы [ 2 ]

0 голосов
/ 18 января 2012
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

РЕДАКТИРОВАТЬ: попробуйте только слегка изменить свой 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 - это число, которое вы конвертируете в текст.)

0 голосов
/ 18 января 2012

Предполагая, что вы рады видеть эти сводки по всей странице, самый простой способ сделать это будет:

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 ...

РЕДАКТИРОВАТЬ: Если вам нужно увидеть результаты вниз по странице, попробуйте:*

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"
...