2016-05-14 21 views
0

これを実行するより良い方法があると確信しています(SQL Server 2014)。SQL Server:条件付き連結

私は顧客、販売、または工場の承認を表す3つの列を持っています。値は「はい」または「いいえ」(サードパーティのアプリ)になります。選択した「はい」フィールドを最初のイニシャルの区切りリストに短縮する必要があります。たとえば、SalesとClientが「Yes」の場合、レポートに「S/C」を表示する必要があります。

それは時間に敏感だったように私は、今のところ、このようにそれをやったが、私は良い方法があります確信している:

case 
    when cfv1.CVFieldValue = 'Yes' and cfv2.CVFieldValue = 'Yes' and cfv3.CVFieldValue = 'Yes' 
     then 'P/S/C' 
    when cfv1.CVFieldValue = 'Yes' and cfv2.CVFieldValue = 'Yes' and cfv3.CVFieldValue = 'No' 
     then 'P/S' 
    when cfv1.CVFieldValue = 'Yes' and cfv2.CVFieldValue = 'No' and cfv3.CVFieldValue = 'Yes' 
     then 'P/C' 
    when cfv1.CVFieldValue = 'No' and cfv2.CVFieldValue = 'Yes' and cfv3.CVFieldValue = 'Yes' 
     then 'S/C' 
    when cfv1.CVFieldValue = 'Yes' and cfv2.CVFieldValue = 'No' and cfv3.CVFieldValue = 'No' 
     then 'P' 
    when cfv1.CVFieldValue = 'No' and cfv2.CVFieldValue = 'Yes' and cfv3.CVFieldValue = 'No' 
     then 'S' 
    when cfv1.CVFieldValue = 'No' and cfv2.CVFieldValue = 'No' and cfv3.CVFieldValue = 'Yes' 
     then 'C' 
    when cfv1.CVFieldValue = 'No' and cfv2.CVFieldValue = 'No' and cfv3.CVFieldValue = 'No' 
     then '' 
end as OKBy 

誰もがより良い方法を得ましたか。

TIA

マーク

+0

Conctenate 3件/ xと最初のスラッシュを取り除く – Serg

答えて

3

1)まずソリューション:あなたは、マッピングテーブルを使用することができ

SELECT x.*, s.RetValue 
FROM dbo.SomeTable x 
LEFT JOIN 
( -- You could insert bellow values into a temp table/@table variable 
    -- Warning: following pair of values (CVFieldValue, CVFieldValue2, CVFieldValue3) should be UNIQUE 
    VALUES 
    ('Yes', 'Yes', 'Yes', 'P/S/C'), 
    ('Yes', 'Yes', 'No', 'P/S'), 
    ('Yes', 'No', 'Yes', 'P/C') --, ... 
) map (CVFieldValue1, CVFieldValue2, CVFieldValue3, RetValue) 
ON x.CVFieldValue1 = s.CVFieldValue1 
AND x.CVFieldValue2 = s.CVFieldValue2 
AND x.CVFieldValue3 = s.CVFieldValue3 

2)第二の溶液:IIFとCONCAT(SQL2012の+)

SELECT STUFF(
      CONCAT(
       IIF(CVFieldValue1 = 'Yes', '/P', ''), 
       IIF(CVFieldValue2 = 'Yes', '/S', ''), 
       IIF(CVFieldValue3 = 'Yes', '/C', ''), 
       ' ' -- If you remove this line then result will be NULL when all columns have non 'Yes' values 
      ), 
      1, 1, '') AS Result 
    ,* 
FROM (
    VALUES 
    ('Yes', 'Yes', 'Yes'), 
    ('Yes', 'Yes', 'No'), 
    ('Yes', 'No', 'Yes'), -- ... Source table 
    ('No', 'No', 'No') 
) SomeTable (CVFieldValue1, CVFieldValue2, CVFieldValue3) 
+0

ありがとう。この仕事は2012年に行われたとは思っていませんでした。リリースノートを読むべきですね:-) – mark1234