透视技巧Oracle PL / SQL,如何透视?

时间:2018-09-06 16:49:28

标签: sql oracle pivot

我有一个关于数据透视的问题,我可以做我想做的事情,除了Y显示的是null而不是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' 

我真正想要的东西得到了

OUTPUT1

 A   P   Y   B
 4   2       1

问题1

我使用求和功能仅显示在轴上。 MAX聚合函数也可以使用。可以用来显示OUTPUT 1,我还是必须使用数据透视来显示OUTPUT1

问题2

Y显示为空,如何编码nvl(,0)以在枢轴中将Y显示为0。

非常感谢您

祝你有美好的一天

2 个答案:

答案 0 :(得分:1)

您可以尝试:

toUpperCase()

输出:

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")
);

答案 1 :(得分:0)

如果在IN (...)子句中为透视式列提供别名,则可以在主选择列表中显式引用它们,并应用nvlcoalesce

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

工作起来有点困难。

在这种情况下,使用sum还是max并不重要,但我认为与max一起使用会更常见。