You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询统计同时含DSV和OWN来源的预订数量

解决方案:统计同时包含DSV和OWN的预订及项目数

我来帮你搞定这个统计需求!根据你的样例数据和期望结果,我们需要找出所有同时存在DSV和OWN两种Sourcing类型的预订,然后统计这类预订的总数,以及这些预订下的所有项目数量。

方法一:使用CTE(公共表表达式)筛选符合条件的预订

这种方法逻辑清晰,先筛选出合格的预订,再关联原表统计总数:

WITH ValidReservations AS (
    SELECT ReservationID
    FROM RESERVATIONS
    GROUP BY ReservationID
    -- 确保该预订同时包含DSV和OWN两种类型
    HAVING MAX(CASE WHEN Sourcing = 'DSV' THEN 1 ELSE 0 END) = 1
       AND MAX(CASE WHEN Sourcing = 'OWN' THEN 1 ELSE 0 END) = 1
       -- 如果你的场景中,预订只能有这两种类型,可加上下面的条件
       -- AND COUNT(DISTINCT Sourcing) = 2
)
SELECT 
    COUNT(DISTINCT vr.ReservationID) AS Reservations,
    COUNT(r.ReservationKey) AS ReservedItems
FROM ValidReservations vr
INNER JOIN RESERVATIONS r 
    ON vr.ReservationID = r.ReservationID;

逻辑解释:

  1. CTE ValidReservations:通过分组ReservationID,用CASE语句分别检查每个预订是否存在DSV和OWN的记录。MAX(...) = 1表示该预订至少有一条对应类型的记录。
  2. 主查询:将筛选出的合格预订与原表关联,统计唯一的预订数量(Reservations)和所有关联的项目总数(ReservedItems)。

方法二:使用EXISTS子查询

如果你更习惯用子查询的写法,也可以这样实现:

SELECT 
    COUNT(DISTINCT r.ReservationID) AS Reservations,
    COUNT(r.ReservationKey) AS ReservedItems
FROM RESERVATIONS r
WHERE 
    -- 检查当前预订存在DSV类型的记录
    EXISTS (
        SELECT 1 
        FROM RESERVATIONS r_dsv 
        WHERE r_dsv.ReservationID = r.ReservationID 
          AND r_dsv.Sourcing = 'DSV'
    )
    -- 同时检查当前预订存在OWN类型的记录
    AND EXISTS (
        SELECT 1 
        FROM RESERVATIONS r_own 
        WHERE r_own.ReservationID = r.ReservationID 
          AND r_own.Sourcing = 'OWN'
    );

逻辑解释:

通过两个EXISTS子查询,直接过滤出同时包含DSV和OWN的预订记录,然后统计唯一预订数和项目总数。

验证结果

用你的样例数据测试这两个查询,都会得到:

Reservations | ReservedItems
-------------|--------------
3            | 7

完全匹配你的期望结果!

内容的提问来源于stack exchange,提问作者Vijay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:02:30