0

我有以下查询,它输出绘图 3 行和 3 列。对于每个“所有者”,我想在同一行中提取共同的“PDF”和第二个表上不存在的“PDF”。

你知道在同一个查询输出中显示不同 where 条件的结果的其他优雅和更快的方法吗?

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
4

2 回答 2

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
于 2013-07-31T14:16:32.890 回答
0

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

  • 第 1 列:所有者
  • 第 2 列:如果值存在于 BACKLOG_NOBILL_STORICO 表中,则为1 ;如果不存在,则为0TMP_BACKLOG_NOBILLING2013_UFF.FLH_PUNTO_EROGAZIONE
  • 第 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来获得1or 0

于 2013-07-31T14:15:16.660 回答