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

时间:2019-06-10 16:54:21

标签: sql

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

表订单

------------------------------------------------------
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     

无法获取订单编号的总数,即8

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

预期输出为

TOTALORDERDSCOUNT     PAIDORDERSCOUNT
      8                     5

5 个答案:

答案 0 :(得分:4)

我认为您需要条件聚合:

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

答案 1 :(得分:1)

试试这个-

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

答案 2 :(得分:0)

您可以在两个计数之间使用交叉联接

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

答案 3 :(得分:0)

    SELECT DISTINCT COUNT(ORDERID) AS [TOTALORDERSCOUNT],
                    COUNT(CASE WHEN STATUS = 'ORDERED' THEN ORDERID ELSE NULL END) AS [PAIDORDERCOUNT]
    FROM ORDERS

TotalOrdersCount将对orderID中的所有不同值进行计数,而PaidOrderCount上的case语句将过滤掉所有不具有所需Status的值。

答案 4 :(得分:0)

我过去用来汇总总数的是

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

如果不需要,我个人不喜欢使用CASE WHEN。对于总和的简单求和,该逻辑看起来有点过多,但是它允许很容易地添加更多条件,并且涉及的类型也更少,至少对于我经常使用的条件。

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

然后,将其嵌套在“ sum”函数内,则将所有从匹配值中表示的1表示为总计。当需要将许多条件缩小为求和值时,我会定期使用此方法进行报表查询。如果您需要在FROM语句中连接表,这还会打开很多选项。

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

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

编辑**我忘了提及count(*)仅在订单号都是唯一值时才有效。一般来说,对于订单表,orderid是一个预期的唯一值,但只想将其添加为补充说明。

相关问题