这个标题有几十个主题,但我找到的没有一个似乎有帮助。
我有一个由两个表组成的查询:表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文章,请告知我们。
答案 0 :(得分:0)
您应该与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