【问题标题】:How to select a query if exist then select or select a another如何选择一个查询(如果存在)然后选择或选择另一个
【发布时间】:2022-01-17 19:37:35
【问题描述】:

我的报告看起来像这样:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 done
12 2021-06-30-18.00.00.224525 22 done
12 2021-07-01-01.00.00.224525 23 done
12 2021-08-01-01.00.00.224525 25 cancel

这是通过 SQL 完成的:

SELECT numberOrder, timestamp, id, status 
from order 
where status <> 'cancel'
order by id 
fetch first row only

结果返回:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 done

如果我没有 2 个或更多订单,如何仅在同一查询中生成取消订单。如果我只有一个订单并且状态为取消(未完成订单)。结果仅显示取消的订单。但是如果我有超过 2 个订单(orders1:done,orders2:done 和 orders3 = cancel)结果应该只有 orders1:done。

报告:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 cancel
SELECT numberOrder, timestamp, id, status 
from order 
where (status <> 'cancel' or status = 'cancel') -- always true the condition
order by id 
fetch first row only

结果:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 cancel

【问题讨论】:

  • order by id, case when status = 'cancel' then 2 else 1 end
  • “如果我没有 2 个或更多订单”是什么意思?这是否意味着,对于某些numberOrder,您必须在以下行中获得不超过1条id最小的记录:status &lt;&gt; 'cancel'(如果存在),status = 'cancel',如果没有status &lt;&gt; 'cancel'的行?如果不是,请解释为什么带有id=11 的行得到status='cancel',如果它在您的示例数据中有status='done'
  • 我的意思是如果我有订单:完成、完成和取消,我只显示完成。但是,如果报告只有取消订单而不是完成订单,我将只显示取消订单

标签: sql database select db2 conditional-statements


【解决方案1】:

如果您只选择一行,则按状态排序是可行的,

SELECT numberOrder, timestamp, id, status 
from order
order by id, status DESC
fetch first row only

如果要选择任意数量的行,只有在没有“完成”时才取消,

SELECT numberOrder, timestamp, id, status 
from order
WHERE (status = 'done'
       or (SELECT status FROM order ORDER BY status DESC LIMIT 1) != 'done')
order by id

不确定最后一个解决方案是否最佳,但它有效。

【讨论】:

    【解决方案2】:

    试试这个:

    WITH T (numberOrder, id, status) AS
    (
    VALUES
      (12, 11, 'done')
    , (12, 22, 'done')
    , (12, 23, 'done')
    , (12, 25, 'cancel')
    
    , (13, 10, 'cancel')
    , (13, 11, 'cancel')
    )
    SELECT numberOrder, id, status
    FROM
    (
    SELECT T.*, ROW_NUMBER () OVER (PARTITION BY numberOrder ORDER BY DECODE (status, 'cancel', 1, 0), id) AS RN_ 
    FROM T
    )
    WHERE RN_ = 1
    

    结果是:

    NUMBERORDER ID STATUS
    12 11 done
    13 10 cancel

    如果结果出乎意料,请在上面的示例数据中提供正确的结果。

    【讨论】:

    • 我的意思是如果我有订单:完成、完成和取消,我只显示完成。但是,如果报告只有取消订单而不是完成订单,我将只显示取消订单
    • 这意味着,我上面的回答应该对你有用......
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多