2017-03-10 1 views
0

私は役に立たないと私の問題の解決策を探しています。私は特定のデータを選択するこのストアドプロシージャを持っています。私は列 'ステータス'を追加するためにそれを変更するように言われました。このストアドプロシージャは、一度に1つのコンポーネントの情報を選択します。だから、成分Aのために言う:上記のクエリの結果があるSQL- selectステートメント内のすべてのクエリ行の3番目の列の値を設定します

Declare @comp varchar(175) 

Select CT.ComponentPart 
     CL.ComponentSupplier, 
     CS.ComponentSource 
From ComponentParts CT 
inner join ComponentSource CS on CS.ComponentID=CT.ComponentID 
inner join ComponentSupplier CL on CL.ComponentTypeID=CS.ComponentTypeID 
Where CT.ComponentPart = @Comp 

今:


 ComponentPart ComponentSupplier  ComponentSource 
     CAF123    Supplier1    PLNT1 
     CAF123    Supplier2    PLNT2 
     CAF123    Supplier3    PLNT3 
     CAF123    Supplier4    PLNT1 

私は別の列を追加するように頼まれた私は、以下のクエリと結果を持っていますPLNTのうちの1つが特定のリストにない場合、列値全体を「廃止」として設定し、その特定のコンポーネントのすべてのプラントがリストに含まれていれば、それを設定します列として「Ac息を呑む "。今度はテーブルを作ってそこにIDフィールド(列名:PlntID、PLNTSource)とともに植物リストを追加しました。

しかし、私は上記のクエリでそのテーブルに参加することを試みましたが、PLNTSourceフィールドがnullだった場合にselect句にcase文がありましたが、それ以外の場合は有効ですが、全体を設定することはできませんクエリのリストに基づいて "status"列を1つの値にするにはどうにかしますか?私が達成しようとしていますどのような結果

ComponentPart ComponentSupplier  ComponentSource Status 
    CAF123    Supplier1    PLNT1   Active 
    CAF123    Supplier2    PLNT2   Obsolete 
    CAF123    Supplier3    PLNT3   Obsolete 
    CAF123    Supplier4    PLNT1   Active 

ComponentPart ComponentSupplier  ComponentSource Status 
    CAF123    Supplier1    PLNT1   Obsolete 
    CAF123    Supplier2    PLNT2   Obsolete 
    CAF123    Supplier3    PLNT3   Obsolete 
    CAF123    Supplier4    PLNT1  Obsolete 

任意のアイデア私は何を取得していますと、

Declare @comp varchar(175) 

Select CT.ComponentPart 
    CL.ComponentSupplier, 
    CS.ComponentSource, 
    CASE 
     WHEN CST.PLNtSource IS NULL 
     THEN 'obsolete' 
     else 'Active' 
    END as 'Status' 
From ComponentParts CT 
inner join ComponentSource CS on CS.ComponentID=CT.ComponentID 
inner join ComponentSupplier CL on CL.ComponentTypeID=CS.ComponentTypeID 
left join ComponentStat CST on CST.PlNtSource=CS.ComponentSource 
Where CT.ComponentPart = @Comp 

クエリ結果の下にありますか?

+0

まあ、 'PLNtSource'はあなたが期待するところでは' NULL'であってはいけません。ソースデータを確認してください。 –

+0

@TimBiegeleisenはい私は、PlntSourceのnull値が1つある場合に基づいて列全体のステータスを設定したいと考えているので、値の1つがnullの場合はnullがない場合はステータスの列全体を廃止に設定しますアクティブ –

答えて

0

状態で一時テーブルに結果を格納し、条件が存在する場合は、使用できる状態

が存在する場合は内部で時代遅れに列のステータスを設定することにより、テーブルを更新し、一時テーブルを使用します値を 'obsolete'としてハードコードするか、変数を宣言して、あなたの条件で 'Obsoletet'または 'Active'として設定してselectステートメントで使用します。

+0

こんにちは、私はそのオプションを考えていたが、応答に感謝しましたが、注文に基づいてその手順でテンポラリテーブルを作ることができませんが、私は機能またはノーでそれを行うことができますか?そして、私はどのように選択されたクエリの列を更新することが可能であるか分からないのですか? –

+0

こんにちは@eto_donnaあなたが存在する条件を使用し、値を '古いもの'としてハードコーディングしたり、変数を宣言して、あなたの条件で 'Obsoletet'または 'Active'として作成し、selectステートメントで使用することができます – Pream

0

CTEを使用する次の方法を提案できますより読みやすく管理しやすいものSQL ServerのCTEは、同じバッチ内で定義されている限り、変数を使用できます。ステータスの決定はクエリ全体で同じですので、サブクエリを使用してこの値を計算し、元のクエリで使用することができます。

WITH cte AS (
    SELECT CT.ComponentPart, 
      CL.ComponentSupplier, 
      CS.ComponentSource, 
      CST.PLNtSource 
    FROM ComponentParts CT 
    INNER JOIN ComponentSource CS 
     ON CS.ComponentID = CT.ComponentID 
    INNER JOIN ComponentSupplier CL 
     ON CL.ComponentTypeID = CS.ComponentTypeID 
    LEFT JOIN ComponentStat CST 
     ON CST.PlNtSource = CS.ComponentSource 
    WHERE CT.ComponentPart = @Comp 
) 
SELECT t1.ComponentPart, 
     t1.ComponentSupplier, 
     t1.ComponentSource, 
     (SELECT CASE WHEN SUM(CASE WHEN t2.PLNtSource IS NULL THEN 1 ELSE 0 END) > 0 
        THEN 'Obsolete' 
        ELSE 'Active' END 
     FROM cte t2) AS Status 
FROM cte t1 
関連する問題