Сводка трюк Oracle PL / SQL, как сводить? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть вопрос о pivot, я мог бы сделать то, что хотел, за исключением того, что Y показывает ноль вместо 0, я хотел бы показать 0 вместо Y.

мой код

SELECT COUNT(DISTINCT cr.report_id) report_id, cr.contact_type'
FROM contact_report cr
WHERE cr.contact_type IN ('A','P','Y','B')
GROUP BY cr.contact_type

показывает

report_id cr.contact_type
2         P
4         A
1         B

ТО я использую пивот

  SELECT * FROM
                    (
                    SELECT COUNT(DISTINCT cr.report_id) report_id, cr.contact_type
                    FROM contact_report cr
                    WHERE cr.contact_type IN ('A','P','Y','B')
                    GROUP BY cr.contact_type
                    )
                    PIVOT
                    (SUM(report_id) FOR contact_type IN (
                                  'A' 
                                  'P' 
                                  'Y' 
                                  'B' 

Я получаю то, что хочу, действительно близко

* 1014 OUTPUT 1 *

 A   P   Y   B
 4   2       1

вопрос 1

Я использую функцию Сумма, чтобы просто показать в сводке. Макс агрегатная функция также работает. который подходит для отображения OUTPUT 1, нужно ли мне использовать pivot для отображения как OUTPUT1

вопрос 2

Y показывает ноль, как я могу кодировать nvl (, 0), чтобы Y отображалось как 0 в сводной таблице.

Большое спасибо

Хорошего дня

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете попробовать:

with dat as (
    select 2 as report_id,'P' as contact_type from dual
    union all
    select 4 as report_id,'A' as contact_type from dual
    union all
    select 1 as report_id,'B' as contact_type from dual
)
select nvl(A,0) as A, nvl(B,0) as B, nvl(P,0) as P, nvl(Y,0) as Y
from (
  select report_id, contact_type from dat
)
PIVOT
(
  max(report_id) for contact_type in ('A'as"A",'B'as"B",'P'as"P",'Y'as"Y")
);

Выход:

A   B   P   Y
4   1   2   0
0 голосов
/ 06 сентября 2018

Если вы зададите псевдонимы для столбцов в предложении IN (...), вы можете явно обратиться к ним в основном списке выбора и применить nvl или coalesce:

SELECT COALESCE(a, 0) as a,
  COALESCE(p, 0) as p,
  COALESCE(y, 0) as y,
  COALESCE(b, 0) as b
FROM (
  SELECT COUNT(DISTINCT cr.report_id) report_id, cr.contact_type
  FROM contact_report cr
  WHERE cr.contact_type IN ('A','P','Y','B')
  GROUP BY cr.contact_type
)
PIVOT (
  SUM(report_id)
  FOR contact_type IN (
    'A' as a, 
    'P' as p, 
    'Y' as y, 
    'B' as b
  )
);

         A          P          Y          B
---------- ---------- ---------- ----------
         4          2          0          1

Ну, у вас нет для их псевдонима, но используются значения по умолчанию:

SELECT COALESCE("'A'", 0) as a,
  COALESCE("'P'", 0) as p,
  COALESCE("'Y'", 0) as y,
  COALESCE("'B'", 0) as b
FROM (
...
* С 1011 * работать немного сложнее.

В этом случае не имеет значения, используете ли вы sum или max, но я думаю, что было бы более привычным использовать max.

...