我有一个关于数据透视的问题,我可以做我想做的事情,除了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。
非常感谢您
祝你有美好的一天
答案 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 (...)
子句中为透视式列提供别名,则可以在主选择列表中显式引用它们,并应用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 (
...
工作起来有点困难。
在这种情况下,使用sum
还是max
并不重要,但我认为与max
一起使用会更常见。