Oracle:一个查询输出不同的条件结果

时间:2013-07-31 13:39:23

标签: oracle

我有以下查询,其中输出绘制了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

2 个答案:

答案 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)

如果我了解您现有的查询,则会尝试显示以下内容:

  • 第1栏:所有者
  • 第2列: 1 如果BACKLOG_NOBILL_STORICO表中存在TMP_BACKLOG_NOBILLING2013_UFF.FLH_PUNTO_EROGAZIONE值,或 0 (如果不存在)
  • 第3栏:与第2栏相反

使用外部联接可以更有效地执行此操作:

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个值。 CASEMAX使用它来转到10