【问题标题】:COUNT items when Table1 has one row per item, Table2 has multiple rows for the same itemCOUNT 个项目,当 Table1 每个项目有一行时,Table2 有多个相同项目的行
【发布时间】:2018-04-08 23:28:45
【问题描述】:

我有以下 2 个表:

Table1:按事务 ID(主键)列出事务。每个事务总是有一行。

表 2:按交易 ID(外键)列出交易,并显示每笔交易的特定付款期间。因此,对于一笔交易(相同的交易 ID),每个付款日期可能会有多行。

如果我通过它们的事务 ID 连接两个表,并计算事务的数量,事务不会被正确计算,因为 Table1 显示同一事务的多行(相同的事务 ID)。

COUNT DISCTINCT 在这种情况下不起作用,因为它仍会计算每一行,其中交易 ID 相同但付款日期不同

我需要与 Table2 的联接,因为存在 WHERE 条件,而 Table1 中没有此条件

对我如何正确计算交易有任何建议吗?

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • 什么是 DISCTINCT?你的意思是 DISTINCT?
  • 对不起,我的意思是 DISTINCT

标签: sql oracle join count


【解决方案1】:

你为什么要加入?看来您需要的所有信息都在表 2 中。例如:

select count(distinct transaction_id)
from table2
where payment_date >= date '2017-01-01';

【讨论】:

    【解决方案2】:

    DISTINCT 将起作用 - 您只需将 distinct 修饰符放在计数的内部并指定字段。

    select count(distinct table1.transactionid) from table1 join table2 on(table1.transactionid = table2.transactionid);
    

    这将只提供 1 行的总数。如果您需要返回多行,则需要添加 group by 子句以满足您的目的。如果您根本不想进行任何分组并希望返回 table2 中的所有行,则需要使用分析/窗口函数,例如 count(distinct table1.transactionid) over ()。如果您想先知道不同事务的总数,然后再知道结果,只需进行 2 次选择即可。

    【讨论】:

    • 虽然当你加入using你可能不能使用table1.transactionid
    • 好的,当您添加像 payment_date 这样每个月都不同的列时,这似乎不起作用,例如:select count (distinct table1.tran_id), table2.payment_date where table1.tran_id = table2.tran_id 在这种情况下它将显示 3 行...
    • 我不确定您期望什么结果 - 如果您添加具有不同值的列并将其添加到分组中,您当然会得到与我建议的选择不同的结果。你希望 resilt 看起来如何?马努行?一排?您希望交易数量在哪一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2023-03-17
    相关资源
    最近更新 更多