检索已完成的订单总数和已付款的订单数

Posted

技术标签:

【中文标题】检索已完成的订单总数和已付款的订单数【英文标题】:Retrieve the total number of orders made and the number of orders for which payment has been done 【发布时间】:2019-06-10 16:54:21 【问题描述】:

检索已完成的订单总数和已付款(已交付)的订单数。

表格顺序

------------------------------------------------------
ORDERID QUOTATIONID     STATUS  
----------------------------------------------------
Q1001   Q1002           Delivered
O1002   Q1006           Ordered                         
O1003   Q1003           Delivered               
O1004   Q1006           Delivered               
O1005   Q1002           Delivered               
O1006   Q1008           Delivered               
O1007   Q1009           Ordered                             
O1008   Q1013           Ordered     

无法获取orderid的总数即8个

select count(orderid) as "TOTALORDERSCOUNT",count(Status) as "PAIDORDERSCOUNT" 
  from orders 
 where status ='Delivered'

预期的输出是

TOTALORDERDSCOUNT     PAIDORDERSCOUNT
      8                     5

【问题讨论】:

那是因为您的WHERE 子句正在过滤掉状态为 Ordered 的行 【参考方案1】:

我想你想要条件聚合:

select count(*) as TOTALORDERSCOUNT,
       sum(case when status = 'Delivered' then 1 else 0 end) as PAIDORDERSCOUNT
from orders;

【讨论】:

谢谢它的工作。你有任何替代解决方案吗?【参考方案2】:

试试这个-

SELECT COUNT(ORDERID) TOTALORDERDSCOUNT, 
SUM(CASE WHEN STATUS = 'Delivered' THEN 1 ELSE 0 END ) PAIDORDERSCOUNT
FROM ORDER

您也可以使用 COUNT 代替 SUM,如下所示-

SELECT COUNT(ORDERID) TOTALORDERDSCOUNT, 
COUNT(CASE WHEN STATUS = 'Delivered' THEN 1 ELSE NULL END ) PAIDORDERSCOUNT
FROM ORDER

【讨论】:

【参考方案3】:

你可以在两个计数之间使用交叉连接

select count(orderid) as TOTALORDERSCOUNT, t.PAIDORDERSCOUNT 
from  orders 
cross  join (
  select  count(Status) PAIDORDERSCOUNT 
  from orders where Status ='Delivered'
)  t 

【讨论】:

【参考方案4】:

我过去用来汇总总数的是

SELECT
count(*) 'Total Orders',
sum( iif( orders.STATUS = 'Delivered', 1, 0 ) ) 'Total Paid Orders'
FROM orders

如果没有必要,我个人不喜欢使用 CASE WHEN。这种逻辑对于简单的总计而言可能看起来有点过多,但它可以很容易地添加更多条件,并且只需要更少的输入,至少对于我经常使用它的用途而言。

使用 iif( 语句设置条件,您正在查找 STATUS 列中值为“已交付”的所有行,通过此设置,如果状态为“已交付”,则将其标记为存储该订单的值为 1,并且如果状态为“已订购”或任何其他值(包括空值),或者如果您需要诸如“待处理”之类的条件,它仍然会给出准确的计数。

然后,将 this 嵌套在“sum”函数中,将匹配值中表示的所有 1 相加。当需要将许多条件缩小到总和值时,我会定期使用此方法进行报表查询。如果您需要在 FROM 语句中连接表,这也为您提供了很多选择。

也只是出于个人喜好,并且取决于您在哪个 SQL 环境中使用它,我倾向于仅在绝对必要时使用 AS 语句进行重命名,而只是用单引号字符串表示列名。做同样的事情,但这只是个人喜好。

如前所述,这似乎做得太多,但对我来说,好的 SQL 允许轻松更改条件,而无需重写整个查询。

编辑** 我忘了提到使用 count(*) 仅在 orderid 都是唯一值时才有效。一般来说,对于订单表,orderid 是预期的唯一值,但只是想将其添加为附注。

【讨论】:

【参考方案5】:
    SELECT DISTINCT COUNT(ORDERID) AS [TOTALORDERSCOUNT],
                    COUNT(CASE WHEN STATUS = 'ORDERED' THEN ORDERID ELSE NULL END) AS [PAIDORDERCOUNT]
    FROM ORDERS

TotalOrdersCount 将计算 orderID 中的所有不同值,而 PaidOrderCount 上的 case 语句将过滤掉任何不具有所需状态的值。

【讨论】:

虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释,并说明适用的限制和假设。

以上是关于检索已完成的订单总数和已付款的订单数的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 中自动处理已付款订单而不是自动完成

WooCommerce:根据运输方式自动完成已付款订单

微店客户支付成功了,银行卡也扣钱了,但是订单显示未付款,店家这边也显示未付款,这是啥情况?

Woocommerce 订单在创建后获得付款

当付款通过PayPal进入时,如何阻止magento将付款状态设置为“已完成”

如何让SAP采购订单无法收获