0

読み取り専用アクセス権を持つデータベースの 1 つの列の値の名前を変更しようとしています。また、2 つの値を 1 つに結合したいと考えています。SQL CASE クエリを使用していますが、値が正しく変換されません。ここに私のSQLがあります:

SELECT
DATE(appraisal.created_time),
appraisal_steps.title,
Count(appraisal.appraisal_id),
case appraisal_steps.title
 when "archive" then "A_Archived"
 when "on_sale" then "J_Selling"
 when "under_evaluation" then "F_Evaluating"
 when "evaluated" then "H_Appraisal Complete"
 when "pending" then "B_Pending"
 when "crap" then "C_Not For Lofty"
 when "waiting_internal_expert_evaluation" then "D_Unclaimed"
 when ("expert_needs_information" OR "admin_needs_information") then "E_Waiting"
 when "seller_answered_to_expert_question" then "G_Needs_Attn"
 when "ready_to_be_sold" then "I_Ready"
 else "wtf"
end as Status

FROM
appraisal
INNER JOIN appraisal_steps ON appraisal.`status` = appraisal_steps.step_id
WHERE
appraisal.powersale = 0
GROUP BY
DATE(appraisal.created_time),
appraisal_steps.title
ORDER BY
appraisal_steps.title DESC, status

結果は一部のステータス (複数のステータスですか? :) では正しいですが、seller_answered_to_expert_question は「E_Waiting」に変換されますが、これは正しくありません。

「When」句の順序を変更すると、別の統計が機能し、機能しなくなります。

私は何を間違っていますか?

4

1 に答える 1

2

問題は、次のCASEようにフォーマットされたステートメントCASE field WHEN criteria THEN ENDが複数の基準を許可しないORAND、そのWHEN行の 2 番目の基準がタイトル フィールドの値と比較されないことです。「G_Needs_Attn」、「I_Ready」、この場合は「wtf」です。

これはいくつかの方法で修正できます。

OR行を 2 つに分割します。

 when "expert_needs_information" then "E_Waiting"
 when "admin_needs_information" then "E_Waiting"

または、次の形式のCASEステートメントを使用します。

    SELECT
    DATE(appraisal.created_time),
    appraisal_steps.title,
    Count(appraisal.appraisal_id),
    case when appraisal_steps.title = "archive" then "A_Archived"
     when appraisal_steps.title = "on_sale" then "J_Selling"
     when appraisal_steps.title = "under_evaluation" then "F_Evaluating"
     when appraisal_steps.title = "evaluated" then "H_Appraisal Complete"
     when appraisal_steps.title = "pending" then "B_Pending"
     when appraisal_steps.title = "crap" then "C_Not For Lofty"
     when appraisal_steps.title = "waiting_internal_expert_evaluation" then "D_Unclaimed"
     when appraisal_steps.title = "expert_needs_information" OR appraisal_steps.title = "admin_needs_information" then "E_Waiting"
     when appraisal_steps.title = "seller_answered_to_expert_question" then "G_Needs_Attn"
     when appraisal_steps.title = "ready_to_be_sold" then "I_Ready"
     else "wtf"
    end as Status       
    FROM
    appraisal
    INNER JOIN appraisal_steps ON appraisal.`status` = appraisal_steps.step_id
    WHERE
    appraisal.powersale = 0
    GROUP BY
    DATE(appraisal.created_time),
    appraisal_steps.title
    ORDER BY
    appraisal_steps.title DESC, status

この形式では、複数のフィールドの条件を評価したり、同じフィールドの複数の条件を評価したりできます。when appraisal_steps.title IN ("expert_needs_information","admin_needs_information") then "E_Waiting"その行にも使用できます。

ORこれは、エラーがキャッチオールとしてどのように終わるかを示すデモです: SQL Fiddle

于 2013-07-09T04:13:09.400 に答える