SELECT COUNT(1)
FROM erp.cir_order
LEFT JOIN
(
SELECT increment_id
FROM magento.sales_flat_order sfo
JOIN Erp.cir_order co
ON co.order_num = sfo.increment_id
WHERE co.status LIKE '3' AND
DATE(SFO.created_at) >= '2016-02-01' AND
DATE(SFO.created_at) <= '2016-06-31'
) AS ch
ON
cir_order.order_num = sq.increment_id
WHERE cir_order.status LIKE '3' AND
cir_order.order_num = ch.increment_id
为什么计数(1)会改变&#34;总数&#34;外部查询返回的记录数量,内部查询中的条件发生变化?
由于我正在使用A LEFT OUTER JOIN,因此我不明白为什么从子查询中筛选出来的incrementId
应该更改外部查询返回的记录数?如果我在加入条件中使用incrementId
,那就是左连接,我的意思是我需要来自cir_order表的所有内容,状态为LIKE&#39; 3&#39;。
(我故意将它用作子查询)。只是不确定它为什么会像这里一样。
我可以得到一些帮助吗?
编辑:
我的问题是如何获取外部查询返回的记录总数,而不关心由于ON子句中的条件而过滤的记录。我相信我们使用外连接吗?那是我尝试过的。我的意思是,当我说LEFT OUTER JOIN时,即使在order_num没有找到与increment_id的匹配时也忽略,在帐户中取出order_num并给我总行数
EDit2:我的原始查询如下所示:
SELECT count(1) as TotalCirOrders, sq.statusDifferentCount as faultCount
FROM
Erp.cir_order corder
left JOIN
(
SELECT count(1) over() as statusDifferentCount, sfo.created_at as createdAt, sfo.increment_id as incrementId
FROM
Magento.sales_flat_order sfo
LEFT JOIN
Erp.cir_order cir_order
ON
cir_order.order_num = sfo.increment_id
where
cir_order.status ='3'
AND
sfo.status NOT IN ('refund', 'partial_refund', 'exchange', 'refund_cash', 'partial_refund_cash', 'refund_points')
AND
TO_DATE(SFO.created_at) >= '2016-02-01'
AND
TO_DATE(SFO.created_at) <= '2016-06-31'
)
AS sq
ON
corder.order_num = sq.incrementId
where
corder.status ='3'
GROUP BY statusDifferentCount;
编辑3:我需要计算order_num和increment_id的数量。虽然条件不同。我只从sales_flat_order表中获取日期字段,所以在商业术语中,我需要计算我们&#34;创建&#34;的cir的order_num。在给定的范围内,然后我需要计算的另一件事是&#34;在给定范围内创建的增量id的数量,状态,即不在提到的列表中#34;
答案 0 :(得分:1)
当子查询返回具有increment_id
相同值的多个记录时,计数可能会有所不同。
LEFT JOIN
还存在一个问题:如果LEFT JOIN
按预期工作(与INNER JOIN
不同),则不得在{{{{}}的联接表上添加任何条件1}}子句,因为在实践中会将WHERE
转换为LEFT JOIN
(除非你有INNER JOIN
条件:这有意义)。在您的查询中,这发生在这里:
IS NULL
您可以将LEFT JOIN Erp.cir_order cir_order
ON cir_order.order_num = sfo.increment_id
where cir_order.status ='3'
条件移到WHERE cir_order.status ='3'
子句中,并仅计算ON
的不同值来解决上述问题:
cir_order.order_num
另一个计数,即受 status 的额外条件影响的那些 increment_id 的计数,你可以通过将该条件移出{{1 }}子句进入SELECT COUNT(DISTINCT cir_order.order_num)
... etc.
构造并对其执行计数:
WHERE
答案 1 :(得分:0)
解决方案是简单地用
包装整个查询 CASE ... WHEN ... THEN increment_id END