【问题标题】:oracle sql count from different table来自不同表的oracle sql计数
【发布时间】:2016-12-09 01:15:01
【问题描述】:

我有两个表格,数据如下:

1) 转表

TICKET  STATUS
56       0
56       0

2) Resa 表

R_TICKET    R_STATUS
56            0

如果两个表中的票数都匹配,我想要这样的结果,然后打印 0 否则 1

我试过下面的查询,但它不起作用

select case when count(a.ticket) = count(b.r_ticket) 
            then 0 
            else 1 
       end as result 
from trans a, resa b

它显示0,但它应该是1,因为票数56trans 中是2,在resa 中是1

有问题的一些变化: 我想要这样的结果:

TICKET  Count(Ticket) r_Ticket  Count(r_Ticket) result
56       2               56           1           1
58       1               58           1           0

【问题讨论】:

  • 问题不清楚。什么是“票数”?在您的第一个表中,您只有一张票,56。您的意思是“行数”而不是“票数”?如果表格中有多个票号怎么办 - 您是否计算表格中的所有行?所有按票号分组的行?表中所有不同的票?结果是表格之间的比较,还是票号的比较? (56号票的计数相同,58号票不同,等等?)
  • 票号可以不同,我希望票数应该匹配,例如在第一个表中票号 56 重复两次,在第二个表中重复一次,因此不匹配应该打印 1。但是如果另一张票假设 58 在第一个表中重复 2 次,并且在第二个表中重复 2 次,则它匹配的应该打印 0。
  • 那么@Tim Biegeleisen 的解决方案正是您想要的。

标签: sql oracle


【解决方案1】:
SELECT COALESCE(t1.ticket, t2.ticket),
       CASE WHEN t1.count = t2.count THEN 0 ELSE 1 END AS match
FROM
(
    SELECT TICKET AS ticket, COUNT(*) AS tcount
    FROM Trans
    GROUP BY TICKET
) t1
FULL OUTER JOIN
(
    SELECT R_TICKET AS ticket, COUNT(*) AS tcount
    FROM Resa
    GROUP BY R_TICKET
) t2
    ON t1.ticket = t2.ticket

【讨论】:

  • 当您有多个 CTE 时,请检查 WITH 子句的正确 Oracle 语法(我怀疑是 SQL 标准语法)。
  • @mathguy 我不知道 Oracle 的 cte 限制。相反,我只使用了直接子查询。更少的味道,更多的代码。
  • 我不知道你的意思是什么 Oracle CTE 限制。 Oracle 为 CTE 实现 SQL 标准语法。当你有多个时,你用逗号分隔它们,你不要再写 WITH。是否有您更频繁使用的 DBMS,它的语法正确吗? (对不起,我只知道 Oracle。)除此之外,WITH 子句是一个很棒的工具。
【解决方案2】:

不要在from 子句中使用逗号。无论如何,在这种情况下这是错误的。 . .如果其中一个表为空,则在聚合之前会得到一个空的中间结果集。

相反,使用子查询来获取计数:

select (case when a.cnt = b.cnt then 0 else 1
        end) as result 
from (select count(*) as cnt from trans) a
cross join
     (select count(*) as cnt from resa b);

【讨论】:

  • 感谢您的快速回复。
  • 实际上我不想按行计数匹配,我希望票号的计数应该匹配。
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 2023-03-31
  • 2022-01-18
  • 1970-01-01
  • 2021-04-23
  • 2020-06-25
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多