簡體   English   中英

如何創建基於另一列中的多個值的新列?

[英]How do I create a new column that is based on multiple values in another column?

我有一個包含三列的表。 姓名、狀態和 ID 這是示例表

現在我必須創建一個名為 final status 的行,它的狀態基於一個人的所有命令。

因此,對於約翰來說,由於他的兩個訂單都已交付,因此最終狀態將是完整的。

對於 David,因為他的兩個訂單的狀態已提交並創建,他的最終狀態將是 IN Progress。 希望這是有道理的。

我已經考慮過嘗試將狀態拆分為不同的列並在后面使用 case 語句,但我不知道如何在單個查詢中完成所有這些操作。

真的很感激這里的一些幫助!

我想補充的另一個澄清是,不同的狀態組合將提供不同的最終狀態:

  1. 當客戶的所有訂單都已交付時,狀態為 COMPLETE

  2. 因此,如果客戶有未交付的訂單和一些已交付的訂單,則狀態將為 IN PROGRESS

  3. 如果所有客戶訂單都已提交,則其狀態將為等待進度

  4. 否則最終狀態將是等待提交

如果您希望以您描述的方式檢索數據,您可以嘗試以下方法 -

Select distinct customer_name, 
CASE 
       WHEN EXISTS (SELECT status FROM cust_order_status os1 
             WHERE os1.order_id = os.order_id 
             and upper(os1.status) <> 'DELIVERED')
       THEN 'In Progress' 
       ELSE 'Complete'
  END AS FinalOrderStatus  
from cust_order_status os;

修改后更新查詢 -

Select distinct customer_name, 
CASE 
       WHEN NOT EXISTS (SELECT status FROM cust_order_status os1 
             WHERE os1.order_id = os.order_id 
             and upper(os1.status) <> 'DELIVERED')
       THEN 'Complete' 
       ELSE 
            CASE 
            WHEN EXISTS (SELECT status FROM cust_order_status os1 
             WHERE os1.order_id = os.order_id 
             and upper(os1.status) = 'DELIVERED')
             THEN 'In Progress'
            ELSE
            CASE 
            WHEN NOT EXISTS (SELECT status FROM cust_order_status os1 
             WHERE os1.order_id = os.order_id 
             and upper(os1.status) <> 'SUBMITTED')
             THEN 'Awaiting Progress'
            ELSE 'Awaiting Submission'
            END
       END
  END AS FinalOrderStatus  
from cust_order_status os;

根據您的澄清,這稍微復雜一些。 您是在暗示狀態本身是序列的一部分,因此我們需要將它們 map 到序列中的順序點,在客戶之間聚合每個不同的狀態,然后將組合結果重新映射到您的組合狀態。

Select Customer_name,
       Case When all_statuses='3' Then 'Complete'
            When all_statuses like '3%' Then 'In Progress'
            When all_statuses like '2%' Then 'Awaiting Progress'
            Else 'Awaiting Submission' End as final_status
From (
      Select Customer_name, 
             Group_Concat(Distinct Case when status='CREATED' Then '1'
                                       When status='SUBMITTED' Then '2'
                                       When status='DELIVERED' Then '3' End
                          Order by Case when status='CREATED' Then '1'
                                      When status='SUBMITTED' Then '2'
                                       When status='DELIVERED' Then '3' End desc
                          Separator '') as all_statuses
      From Mytable
      Group by Customer_name
     )

如果 Group_Concat 不允許您在映射時嵌入案例,那么您必須在一個 Select 中進行案例映射,第二個是 group_concat,第三個是重新映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM