Oracle SQL嵌套计算联接

Oracle SQL嵌套计算联接,oracle,join,Oracle,Join,有几十条这样标题的帖子,但我发现没有一条有用 我有一个由两个表组成的查询:表Customer和表Transactions 每个客户在交易表中可以有多个条目。我想做的是在给定的时间范围内,假设在交易表中跟踪日期,在客户表中找到每个客户,并从该客户的交易表中找到三种不同的计算。第一个数字计算已发布的报价,第二个数字计算订单数量,第三个数字是未转换为订单的报价总数。计算本身并不重要,因为它与这个问题的解决方案有关 我觉得有某种类型的连接我没有正确地利用它来推导正确的值,但这里是我迄今为止简化的 SEL

有几十条这样标题的帖子,但我发现没有一条有用

我有一个由两个表组成的查询:表Customer和表Transactions

每个客户在交易表中可以有多个条目。我想做的是在给定的时间范围内,假设在交易表中跟踪日期,在客户表中找到每个客户,并从该客户的交易表中找到三种不同的计算。第一个数字计算已发布的报价,第二个数字计算订单数量,第三个数字是未转换为订单的报价总数。计算本身并不重要,因为它与这个问题的解决方案有关

我觉得有某种类型的连接我没有正确地利用它来推导正确的值,但这里是我迄今为止简化的

SELECT Customer.CustomerID, Count(TransactionAlias1.*), Count(TransactionAlias2.*), Count(TransactionAlias3.*)
FROM Customer
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias1 ON 
     TransactionAlias1.CustomerID = Customer.CustomerID
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias2 ON 
     TransactionAlias2.CustomerID = Customer.CustomerID
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias3 ON 
    TransactionAlias3.CustomerID = Customer.CustomerID
GROUP BY Customer.CustomerID
对我来说奇怪的是,只有前两个内部联接产生前两个计数的正确值。添加第三个内部联接将使其他值无效。在每个内部联接中单独运行select语句会产生正确的计数


任何帮助都将不胜感激。如果你们中有人知道另一篇StackOverflow文章解决了同样的问题,请告诉我。

应该不会奇怪-三个子查询中的每个子查询中肯定有不同的WHERE filter,因此,除非每个客户对每个子查询至少有一个事务,否则内部联接将产生您意想不到的结果

您应该继续使用LEFT JOIN,以便为所有客户接收正确的结果。 或者,您可以执行以下操作:

SELECT Customer.CustomerID, sum(Count1) as Count1, sum(Count2) as Count2, sum(Count3) as Count3
FROM Customer
LEFT JOIN (
    SELECT CustomerID,
    case when ... then 1 else 0 end as Count1,
    case when ... then 1 else 0 end as Count2,
    case when ... then 1 else 0 end as Count3
    FROM Transactions
) s Txn
on txn.CustomerID = Customer.CustomerID
GROUP BY Customer.CustomerID

在我看来,第二次加入应该通过计数

将条件从联接条件移动到大小写表达式如何

select Customer.CustomerId
    , count(case when [...] then 1 else null end) as Quote_Count
    , count(case when [...] then 1 else null end) as Order_count
    , count(case when [...] then 1 else null end) as Quote_not_order_count
from Customer
left join Transactions 
    on Transactions.CustomerId = Customer.CustomerId

我在留言中说了“内部连接”,但我应该说“左连接”。我根本没有使用内部联接。