2016-08-03 9 views
0

空白の値を入力するクエリを作成するときに問題が発生します。私はそれが混乱するように聞こえるので、私が実証し、説明することができます。SQL Server 2008 - 空白の値を入力します。

表1

Name Serial TrackNum 
AAA    
AAA  222  T1 
BBB  333  T1 
BBB  444  T2 
BBB  555 
BBB  666 
CCC  777  T3 
CCC  888    
CCC  999 
DDD  998  
EEE  997  T4 
EEE  996  
FFF    T5 

私はこの結果を生成するクエリを形成するために、問題が生じています:

は、私は、「表1から選択した名前、シリアル、TrackNum」クエリを持っており、結果は以下の通りです、言います以下。シリアル#555と666は上の行から "T2"、シリアル#888と999では同じものが継承されています。そしてFFFはシリアルではなくトラック#を持っています。

Name Serial TrackNum 
AAA    
AAA  222  T1 
BBB  333  T1 
BBB  444  T2 
BBB  555  T2 
BBB  666  T2 
CCC  777  T3 
CCC  888  T3    
CCC  999  T3 
DDD  998  
EEE  997  T4 
EEE  996  T4 
FFF    T5   

サンプルコードをご提供いただきありがとうございます。これらはNULL値ですと仮定すると、

+1

最初はNULL値か空文字列ですか? – BJones

+0

アイデアについてはhttp://stackoverflow.com/a/710222/2055998をご覧ください。 –

+0

あなたの計算された関連tracknumを表す追加の列で初期のテーブルを拡張すると思います。 trackNumがnullでない最大の名前とシリアル番号に対応するtrackNumが必要です。 – Beth

答えて

1

でしょう、あなたのニーズに合わせて、この作品?この手法の注意点は、AAAの最初の行には、NULLではなく、TrackNumT1と表示されます。

DECLARE @Table1 TABLE (Name VARCHAR(3),Serial VARCHAR(3),TrackNum VARCHAR(3)) 
INSERT @Table1 
VALUES ('AAA','','') 
     ,('AAA','222','T1') 
     ,('BBB','333','T1') 
     ,('BBB','444','T2') 
     ,('BBB','555','') 
     ,('BBB','666','') 
     ,('CCC','777','T3') 
     ,('CCC','888','')   
     ,('CCC','999','') 

;WITH c AS (SELECT Name, 
        MAX(TrackNum) AS TrackNum 
      FROM @Table1 
      GROUP BY Name) 
SELECT t.Name, t.Serial, CASE 
          WHEN t.TrackNum IS NULL OR t.TrackNum = '' 
           THEN CASE 
             WHEN t.Serial IS NULL OR t.Serial = '' 
              THEN '' 
             ELSE c.TrackNum 
             END 
          ELSE t.TrackNum 
          END AS TrackNum 
FROM @Table1 t 
JOIN c ON t.Name = c.Name 

UPDATEにしたい場合は、これはあなたにアイデアを与えることができます。

;WITH c AS (SELECT Name, 
        MAX(TrackNum) AS TrackNum 
      FROM @Table1 
      GROUP BY Name) 

UPDATE t 
SET t.TrackNum = c.TrackNum 
FROM @Table1 t 
JOIN c ON t.Name = c.Name 
WHERE t.TrackNum IS NULL OR t.TrackNum = '' 

SELECT * 
FROM @Table1 
+0

これは非常に近いですが、AAAの "T1"の最初の行は私のためには機能しません。一緒に入れてくれてありがとう。これを達成するための正しい軌道のように思えます。 – Milacay

+0

@Milacay更新された回答を参照してください。私は 'CASE'ステートメントに追加しました。それがあなたのニーズに合っているかどうか教えてください。 – BJones

+0

これは正しく動作します。どうもありがとうございます。 – Milacay

0

:ミスター・ベン・ガンの

SELECT Name, Serial, 
    CAST(
    SUBSTRING(
     MAX(CAST(Name AS BINARY(4)) + CAST(Serial AS BINARY(4))) 
     OVER(ORDER BY Name 
       ROWS UNBOUNDED PRECEDING), 
     5, 4) 
    AS varchar(5)) AS TrackNum 
FROM table 

礼儀、http://sqlmag.com/t-sql/last-non-null-puzzle

+1

'ROWS UNBOUNDED PRECEDING'は2008年と互換性がありません。 –

+0

お返事ありがとうございます。マーティンが言っていたように、私は2008年のサーバーで行なわれなかったローズを持っていません。 – Milacay