2017-02-09 20 views
-1
RefNo Title 
----- ----- 
12  Check 
12  With Sample 
13  Cash 
13  With Sample 
14  Cash 
14  Check 
15  Deposit 
15  Check 

私は以下の出力を得たいと思うこのテーブルを持っています。SQL Serverで複数の条件を実行する方法

「現金」は存在する場合はELSE

AND「サンプルとの」THEN「サンプルと」がある場合

:同じREFNOと行の基本的

RefNo Title  Desc 
----- -----  ----- 
12  Check  With Sample 
12  With Sample With Sample 
13  Cash   Hello 
13  With Sample Hello 
14  Cash   Cash 
14  Check  Cash 
15  Deposit  Check 
15  Check  Check 

説明は、この優先順位を持っているでしょう'サンプルと' THEN 'こんにちは' '現金' THEN '現金' THEN [チェック] [チェック]がある場合はELSE

をがある場合ELSE

この説明は、同じRefNoを持つすべての行に適用されます。ありがとうございました。あなたがRefNo行の各グループにウィンドウ表示の集計を適用する必要が

+0

各リファレンスには2タイトルしかありませんか? –

+0

あなたの望む結果によると、「こんにちは」状態が最初に起こるはずです。さもなければ、あなたはそれらの場合に「サンプルあり」を得るでしょう。 – Andrew

答えて

2

:クエリ以下

WITH cte AS 
(
    SELECT 
     Max(CASE WHEN Title = 'With Sample' THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS SampleFlag 
     ,Max(CASE WHEN Title = 'Cash'  THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CashFlag 
     ,Max(CASE WHEN Title = 'Check'  THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CheckFlag 
     ... 
    FROM tab 
) 
SELECT 
    CASE 
     WHEN SampleFlag + CashFlag = 2 THEN 'Hello' 
     WHEN SampleFlag = 1   THEN 'With Sample' 
     WHEN CashFlag = 1    THEN 'Cash' 
     WHEN CheckFlag = 1    THEN 'Check' 
    END 
    ... 
FROM cte 
+0

'Hello'条件を最初に移動する必要があります。そうでない場合は、 'With Sample'が表示されます。 – Andrew

+0

@Andrew:うん、私はちょうど間違っている間違いである元のロジックを翻訳しました.-ありがとう – dnoeth

-1

はあなたに望ましい結果が得られます

select t1.RefNo, t1.Title, case 
WHEN (t1.Title = 'Check' AND t2.Title = 'With Sample') OR (t2.Title = 'Check' AND t1.Title = 'With Sample') Then 'With Sample' 
WHEN (t1.Title = 'Cash' AND t2.Title = 'With Sample') OR (t2.Title = 'Cash' AND t1.Title = 'With Sample') Then 'Hello' 
WHEN (t1.Title = 'Cash' AND t2.Title = 'Check') OR (t2.Title = 'Cash' AND t1.Title = 'Check') Then 'Cash' 
WHEN (t1.Title = 'Check' AND t2.Title = 'Deposit') OR (t2.Title = 'Check' AND t1.Title = 'Deposit') Then 'Check' 
END 
from TestCase t1 cross join TestCase t2 where t1.Title != t2.Title and t1.RefNo = t2.RefNo 
+0

私はダウンボートしませんでしたが、今は動作していますが、維持するのは非常に難しいです。 3番目のステータスを検討する必要がある場合はどうなりますか?もう1つの自己結合を追加する必要があります... – Andrew

+0

'RefNo'に2つ以上の行があるとどうなりますか? Btw、実際には、非等価性に基づく '内部結合 'であり、'十字結合'ではありません。 – dnoeth

0

はたぶん、別のアプローチがありますが、次のように鉱山があります: -

  1. Iに基づいて値を連結のための使用XML PATH D.
  2. 条件を切り替えるにはCaseを使用してください。

デモ: -

declare @MyTable table (RefNo int ,Title varchar(20)) 
insert into @MyTable values (12 , 'Check') 
insert into @MyTable values (12 , 'With Sample') 
insert into @MyTable values (13 , 'Cash') 
insert into @MyTable values (13 , 'With Sample') 
insert into @MyTable values (14 , 'Cash') 
insert into @MyTable values (14 , 'Check') 
insert into @MyTable values (15 , 'Deposit') 
insert into @MyTable values (15 , 'Check') 

select RefNo , Title , case 
          when (SELECT Title + ',' 
            FROM @MyTable p2 
            WHERE p1.RefNo = p2.RefNo 
            ORDER BY Title 
            FOR XML PATH('')) like '%With Sample%' 
            AND 
            (SELECT Title + ',' 
            FROM @MyTable p2 
            WHERE p1.RefNo = p2.RefNo 
            ORDER BY Title 
            FOR XML PATH('')) not like '%Cash%' 
          then 'With Sample' 
          when (SELECT Title + ',' 
            FROM @MyTable p2 
            WHERE p1.RefNo = p2.RefNo 
            ORDER BY Title 
            FOR XML PATH('')) like '%Cash,With Sample,%' 
          then 'Hello' 

          when (SELECT Title + ',' 
            FROM @MyTable p2 
            WHERE p1.RefNo = p2.RefNo 
            ORDER BY Title 
            FOR XML PATH('')) like '%Cash%' 
          then 'Cash' 
          when (SELECT Title + ',' 
            FROM @MyTable p2 
            WHERE p1.RefNo = p2.RefNo 
            ORDER BY Title 
            FOR XML PATH('')) like '%Check%' 
          then 'Check' 
          end [Desc] 

from @MyTable p1 

結果: -

enter image description here

+0

あまりにも多くのオーバーキルとエラーが発生しやすい。たとえば、RefNo 12に 'Cash'を追加すると、「Hello」ではなく「Cash」が表示されます。あなたは名前でタイトルを並べ替えることに頼っています。これは将来のトラブル(あなたがすでに持っているものの他に)を呼びます。 – Andrew

0

dnoethの答えは、おそらく最高の1(それだけでその条件の順序が固定持っている必要があります私がコメントしたように)しかし、私は誰かが好きかもしれないこの他のアプローチを考えました:

WITH cte AS 
(
    SELECT RefNo, SUM(CASE Title WHEN 'With Sample' THEN 4 WHEN 'Cash' THEN 2 WHEN 'Check' THEN 1 END) Total 
    FROM YourTable 
    GROUP BY RefNo 
) 
SELECT YT.RefNo, Title, CASE 
    WHEN Total & 6 = 6 THEN 'Hello' 
    WHEN Total & 4 = 4 THEN 'With Sample' 
    WHEN Total & 2 = 2 THEN 'Cash' 
    WHEN Total & 1 = 1 THEN 'Check' END AS "Desc" 
FROM YourTable YT 
INNER JOIN cte ON YT.RefNo = cte.RefNo 

ご覧のとおり、各タイトルに2の累乗を割り当てて、ビットごとの演算子を使用して各ケースを識別します。

+0

タイトルごとに複数の行があることは決してありません:-) – dnoeth

+0

私はあなたが何を意味するかを見ます。その場合、CTEの中で 'FROM(SELECT DISTINCT RefNo、Title FROM YourTable)YT'を使う必要があります。 – Andrew

関連する問題