2017-05-15 9 views
0

初めての予期しない結果を得ました。ネストされたSQL文は、ポスター長時間匿名ユーザー

私は人々が属するレベルに基づいて、登録情報をプルしようとしています。レベル00の人は2つの登録のうちの1つに収まるので、ネストされたケースステートメントを実行しようとしています。ステートメントが立っているので、ネストされたケースステートメントの両方の結果に表示されている人がかなりいます。他のすべてのレベルは正常に動作しています。誰もが結果が両方のときとelse文に表示される理由を任意のアイデアを持っています、または代わりに、ネストされたCASE文のこれをコーディングするより適切な方法はありますか?

  • 人:= 100、Field_Number = 65およびフィールド_value = Yのような複製をもたらすスクリーンを有するの基準を満たす00のレベルの人に

    CASE 
         WHEN B.Level = '00' 
         THEN  
           CASE 
            WHEN C.SCREEN = '100' and C.FIELD_NUMBER = '65' and C.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
            ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
           END 
          WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
          WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
          WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
          WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
          WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
          ELSE CONCAT(':', B.Location, B.Level) 
    END AS Registration, 
    

    現在の結果X位置1:レベル1:H

  • 人X位置1:レベル1:

人Xは、基準はその後、彼らが示す第2の結果を持つべきではない、あるいは少なくともそれがあることを満たしている場合結果私は行くつもりです。 caseと間違って何もありません

+0

参加については、「人」あたり1つの値を戻していますか? – JohnHC

+5

編集ご質問や、サンプルデータと望ましい結果を提供します。 'case'式では、ちょうど1つの' then'節が返されます。 –

答えて

0

、問題はあなたのjoinです。それは、正しく、または間違って、複写された1人の人に複数の値を返すことです。

あなたが例の多数の上にcase表現の有効性をテストしたい場合は、以下を試すことができます。

-- Set up some test data: 
declare @t table ([Level] nvarchar(10),Screen nvarchar(10), Field_Number nvarchar(10), Field_Value nvarchar(10), [Location] nvarchar(10)); 
insert into @t values('00','100','65','Y','Location1'); 

-- Generate 10 rows of the same values: 
with t as 
(
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t 
), tt as 
( -- And then join them together 6 times to get 1 million rows (10^6): 
    select t1.* from t t1, t t2, t t3, t t4, t t5, t t6 
) 
select CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
     END AS Registration 
    ,count(*) as c 
from tt b 
group by CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
    END 

このステートメントの出力は全く同じで100万のRegistration値であります:Location1:00:H。あなたが本当にしたい場合は、あなたが好きなように多くの値としてこのスクリプトのリターンを作ることができるし、あなたのRegistrationは変更されません。これを解決するには


Person Xのために濾過し、あなたのBCテーブル間のちょうどjoin(私は願っています、これらは説明の別名だけでなくABCDなどありますか?)にselectを行うと見返されるもの私は100%あなたが異なるデータの組み合わせを見ると確信しています。

+0

それは意味があります。私は事件に集中しすぎていて、参加についても考えなかった。ご協力ありがとうございました。 – Seth

+0

それは私が必要としていた答えなので、私はそのようにマークしました。私は新しいのでカウンターを増やすことはありません。再度、感謝します。 – Seth

関連する問題