对列值进行分组CASE语句

时间:2017-11-01 16:04:40

标签: sql sql-server

我的情况是订单可以有多个报价。现在您可以看到报价可以打开或取消。我希望返回订单,其中每个报价都被取消。

Order No     Quote Number    Quote Status
256             12              CANCEL
256             13              OPEN
678             18              CANCEL
678             16              CANCEL
678             19              CANCEL

此数据的预期结果:

Order No     Quote Number    Quote Status
678             16              CANCEL

普通的group by子句给我这个结果

SELECT order No, Min(Quote Number), Min (Quote Status)
FROM TABLE
GROUP BY Order No

Order No     Quote Number    Quote Status
256             12              CANCEL
678             16              CANCEL

但是很明显这不是我想要的,因为它仍然会返回256级。因此它看起来被取消了但是如果这是有意义的话它真的有一个打开的引用。

有人可以帮忙吗?感谢

3 个答案:

答案 0 :(得分:5)

你非常接近。只需使用having子句:

SELECT orderNo, MIN(QuoteNumber), MAX(QuoteStatus)
FROM TABLE
GROUP BY OrderNo
HAVING MIN(QuoteStatus) = MAX(QuoteStatus) AND MIN(QuoteStatus) = 'Cancelled'

答案 1 :(得分:0)

我知道您从Cancel函数获取Min(),但我认为这对您也有用。

SELECT order No, Min(Quote Number), Min (Quote Status)
FROM TABLE
Where [Quote Status] = 'CANCEL'
AND [Order No] NOT IN (Select [Order NO] From TABLE Where [Quote Status] = 'OPEN')
GROUP BY Order No

答案 2 :(得分:0)

您可以尝试此代码

5 June

我假设QuoteStatus字段中没有NULL值。如果有NULL,则代替SELECT OrderNo,MIN(QuoteNumber),QuoteStatus FROM TABLE WHERE OrderNo NOT IN ( SELECT OrderNo FROM TABLE Where QuoteStatus <> 'CANCEL') GROUP BY OrderNo,QuoteStatus Where QuoteStatus <> 'CANCEL'