SQL嵌套计算JOIN

时间:2014-10-21 20:54:34

标签: oracle join

这个标题有几十个主题,但我找到的没有一个似乎有帮助。

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

每个客户可以在Transactions表中有多个条目。我想要做的是在给定的时间范围内(假设在Transactions表中跟踪日期)获取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文章,请告知我们。

2 个答案:

答案 0 :(得分:0)

不应该是奇怪的 - 三个子查询中的每一个都有明显不同的WHERE过滤器,所以除非每个客户的每个子查询至少有一个事务,否则内部联接将产生你不想要的结果&# 39;期待。

您应该与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

答案 1 :(得分:0)

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

如何将条件从连接条件移至case表达式?

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