使用SQL选择第1列中具有相同值但在第2列和第3列中具有不同值的所有行

Jun*_*Dev 6 sql t-sql sql-server

我有一张看起来像这样的桌子

在此输入图像描述

每个[订单号]可以有1个或多个[行号],每个[行号]可以具有[SHIPPED]或[UNSHIPPED]状态.

我想选择所有[订单号],其中包含[线号]同时包含[运输]和[未运输].

例如,这些[订单号]包含[行号]同时[SHIPPED]和[UNSHIPPED],因此应该选择它

在此输入图像描述

这是我的查询但它没有返回正确的结果

SELECT [Order number], [Line number], [SHIPPED/UNSHIPPED] 
FROM [mytable]
WHERE [Order number] IN (SELECT [Order number]
                         FROM [mytable]
                         GROUP BY [Order number]
                         HAVING COUNT(*) > 1)
ORDER BY [Order number], [Line number]
Run Code Online (Sandbox Code Playgroud)

请问我的查询中缺少什么?谢谢.

Tim*_*sen 4

这是一种方法:

WITH cte AS (
    SELECT [Order number]
    FROM mytable
    WHERE [SHIPPED/UNSHIPPED] IN ('SHIPPED', 'UNSHIPPED')
    GROUP BY [Order number]
    HAVING COUNT(DISTINCT [SHIPPED/UNSHIPPED]) = 2
)

SELECT *
FROM mytable
WHERE [Order number] IN (SELECT [Order number] FROM cte);
Run Code Online (Sandbox Code Playgroud)

CTE 查找所有具有已发货和未发货记录的订单号。它的工作原理是首先将给定订单的记录限制为仅包含已发货/未发货的订单,然后断言该组的不同计数为 2,这意味着两种类型的发货都存在。