我有以下查询,其中输出绘制了3行和3列。 对于每个“所有者”,我想在同一行中提取共同的“PDF”和第二个表中不存在的“PDF”。
您是否知道其他优雅且更快捷的方式在同一查询输出中显示不同条件的结果?
WITH temp
AS (SELECT T.OWNER,
(SELECT FLH_PUNTO_EROGAZIONE
FROM DUAL
WHERE EXISTS
(SELECT 1
FROM NETATEMP.BACKLOG_NOBILL_STORICO p
WHERE p.FLH_PUNTO_EROGAZIONE = t.FLH_PUNTO_EROGAZIONE))
"Pdf in comune",
(SELECT FLH_PUNTO_EROGAZIONE
FROM DUAL
WHERE NOT EXISTS
(SELECT 1
FROM NETATEMP.BACKLOG_NOBILL_STORICO p
WHERE p.FLH_PUNTO_EROGAZIONE = t.FLH_PUNTO_EROGAZIONE))
"Pdf NON in comune"
FROM NETATEMP.TMP_BACKLOG_NOBILLING2013_UFF t)
SELECT owner, COUNT (DISTINCT "Pdf in comune") "Pdf in comune", COUNT (DISTINCT "Pdf NON in comune") "Pdf NON in comune"
FROM temp
GROUP BY OWNER
答案 0 :(得分:1)
我使用外部联接,我希望我理解你的需要:
select OWNER, sum(common) "Pdf in comune", count(*) - sum(common) "Pdf NON in comune"
from
(
select t.OWNER, p.FLH_PUNTO_EROGAZIONE,
decode(t.FLH_PUNTO_EROGAZIONE, null, 0, 1) common
from NETATEMP.TMP_BACKLOG_NOBILLING2013_UFF t,
NETATEMP.BACKLOG_NOBILL_STORICO p
where p.FLH_PUNTO_EROGAZIONE (+) = t.FLH_PUNTO_EROGAZIONE
)
group by OWNER
答案 1 :(得分:0)
如果我了解您现有的查询,则会尝试显示以下内容:
TMP_BACKLOG_NOBILLING2013_UFF.FLH_PUNTO_EROGAZIONE
值,或 0 (如果不存在)使用外部联接可以更有效地执行此操作:
SELECT
T.OWNER,
MAX(CASE
WHEN P.FLH_PUNTO_EROGAZIONE IS NOT NULL THEN 1
ELSE 0 END) AS "Pdf in comune",
MAX(CASE
WHEN P.FLH_PUNTO_EROGAZIONE IS NULL THEN 1
ELSE 0 END) AS "Pdf NON in comune"
FROM TMP_BACKLOG_NOBILLING2013_UFF T
LEFT JOIN BACKLOG_NOBILL_STORICO P
ON T.FLH_PUNTO_EROGAZIONE = P.FLH_PUNTO_EROGAZIONE
GROUP BY T.OWNER
当您离开加入时,TMP_BACKLOG_NOBILLING2013_UFF
中没有匹配项的任何BACKLOG_NOBILL_STORICO
行的NULL
列都会有BACKLOG_NOBILL_STORICO
个值。 CASE
和MAX
使用它来转到1
或0
。