【问题标题】:Update the column according to order status根据订单状态更新列
【发布时间】:2021-12-08 11:28:30
【问题描述】:

输入:

CUSTOMER_NAME       ORDER_ID      STATUS
-----------------------------------------------
  john                j1          delivered
  john                j2          delivered
  david               d1          submitted
  david               d3          created
  smith               s1          submitted
  krish               k1          created

一家披萨公司正在接受客户的订单,每个披萨订单都作为单独的订单添加到他们的数据库中,每个订单都有一个相关的状态“已创建、已提交或已交付”。最终状态根据状态计算如下

当客户的所有订单状态为“已交付”时,客户订单的最终状态为“已完成”

如果客户有一些未交付的订单和一些已交付的订单,则最终状态为“进行中”

如果所有客户订单均已提交,则最终状态为“等待进度”

否则最终状态为“等待提交”

期望的输出:

CUSTOMER_NAME                 FINAL_STATUS
--------------------------------------------------
david                         IN PROGRESS
john                          COMPLETED
krish                         AWAITING SUBMISSION
smith                         AWAITING PROGRESS

【问题讨论】:

  • 这听起来像是家庭作业。我们可以帮助您查看您已经尝试过的内容,但我们不只是提供代码解决方案。尝试学习材料,然后如果您对您的代码有具体问题,您可以发布您尝试过的内容,我们可以提供帮助。
  • 附带说明,升级到现代版本的 SQL Server 对您非常有益。 SQL Server 2005 的生命周期结束 5 1/2 年。
  • 我投票决定将此问题作为离题结束,因为它似乎要求作业帮助,其中必须包括您所做工作的摘要远远解决问题,并描述您解决问题的困难。 What topics can I ask about here?您可以在常见问题解答中找到有关如何提出家庭作业问题的更多信息:How do I ask and answer homework questions?

标签: sql sql-server sql-server-2005


【解决方案1】:

披萨订单状态

按客户名称排序结果。

select customer_name
   , case when count(case when status <> 'CREATED' then 1 end) = 0 then 'AWAITING SUBMISSION'  
          when count(case when status <> 'SUBMITTED' then 1 end) = 0 then 'AWAITING PROGRESS'
          when count(case when status <> 'DELIVERED' then 1 end) > 0 then 'IN PROGRESS'
          when count(case when status <> 'DELIVERED' then 1 end) = 0 then 'COMPLETED'          
     end
from customer_order
group by customer_name
ORDER BY customer_name ASC;

【讨论】:

    【解决方案2】:

    您可以对结果进行旋转,例如:

    with pivoted as (
        SELECT *
        FROM orders
        pivot(
            count(order_id) for status in (
            [delivered], [submitted], [created])
        )as pv
    )
    SELECT
        p.CUSTOMER_NAME,
        CASE
        WHEN delivered>0 AND submitted=0 AND created=0  THEN 'COMPLETED'
        WHEN delivered>0 AND (submitted>0 OR created>0) THEN 'IN PROGRESS'
        WHEN delivered=0 AND submitted>0 AND created=0 THEN 'AWAITING PROGRESS'
        ELSE 'AWAITING SUBMISSION'
    END AS FINAL_STATUS
    FROM pivoted p
    

    但您应该注意,在您的问题中,David 所需的输出是 IN PROGRESS,但根据逻辑定义,对于此输出,他应该有一个已交付的订单。

    【讨论】:

      【解决方案3】:

      这是一种方法:

      select customer_name 
         , case when count(case when status <> 'created' then 1 end) = 0 then 'awaiting submission'  
                when count(case when status <> 'submitted' then 1 end) = 0 then 'awaiting progress'
                when count(case when status <> 'delivered' then 1 end) > 0 then 'In progress'
                when count(case when status <> 'delivered' then 1 end) = 0 then 'Completed'          
           end
      from orders
      group by customer_name
      

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 2021-04-08
        • 2021-12-09
        • 1970-01-01
        • 2021-02-16
        • 2014-09-06
        • 2017-07-16
        • 2021-05-06
        • 1970-01-01
        相关资源
        最近更新 更多