首页 > 解决方案 > 如何计算sql中where语句中的行数?

问题描述

我在 SQL Server 中有两个表:

我想获得具有另外两个属性的所有订单:

  1. 1有多少行is_pay

     where payment_id = <...> payment.is_pay = 1
    
  2. 以及行数(没有第一个过滤器)

     select count(*) 
     from payment 
     where payment_id = <...>
    

所以我写了这个查询:

select 
    *, 
    (select count(1) from payment p 
     where p.payment_id = o.payment_id and p.is_pay = 1) as total 
from 
    order o

问题是如何计算没有is_pay= 1 的行?

我的意思是“许多中的一些”

标签: sqlsql-servertsqlgroup-byleft-join

解决方案


首先聚合payment然后加入order

SELECT o.*, p.total_pay, p.total
FROM [order] o 
LEFT JOIN (
  SELECT payment_id, SUM(is_pay) total_pay, COUNT(*) total
  FROM payment
  GROUP BY payment_id
) p ON p.payment_id = o.payment_id;

如果所有订单至少有 1 笔付款,则更LEFT改为加入。 此外,如果的数据类型为,则更改为:INNER
is_payBITSUM(is_pay)

SUM(CASE WHEN is_pay = 1 THEN 1 ELSE 0 END)

推荐阅读