2017-05-16 5 views
1

値が 'A'、 'B'または 'C'の名前列を持つテーブルがあります。ただし、A、B、C、A、B、C、...の順に表示されますが、名前がなくなることがあります(A、B、Cが欠落しているA、B、C、...)。私はすべての名前を忘れずに順番に提供するクエリが必要です。紛失した名前の値は0である必要があります。注文を維持するために値が0の不足行を表示

PS:このテーブルはNetezzaデータベースにあり、SSISパッケージによって毎回新しいデータで切り捨てられ再ロードされます。私たちが知っているのは、1〜27の値を持つID列もあるということです。しかし、切り捨てと読み込み後の行数は異なる可能性があります。私が望むテーブルはIDカラムを必要としませんが、それがあれば、それは1から27になります。つまり、「テーブルが必要です」には常に27行が必要です。

enter image description here

+3

SQLテーブルは順序付けられていないセットを表します。列が順序を指定しない限り、順序はありません。あなたはそのようなコラムを持っていますか? –

+0

@GordonLinoffご回答いただきありがとうございます。あなたの質問を正しく理解しているかどうかはわかりません。しかし、私は他のコラムはありません。これらはアプリケーションに何を与えるのでしょうか?アプリケーションはA、B、Cの順番でレコードを読み取る必要があります。注文が維持されない場合、それはクラッシュします。値がない場合は、値0のA、B、Cを持つ必要があります。 – TheEsnSiavashi

+1

あなたが持っているテーブルでは、A = 4がB = 1とペアになっており、A = 2.5がB = 3とペアになっているとどう思いますか?これらの値は、他の列を持たないデータベース表にすでに存在していますか?あるいは、彼らはテキストファイルのような別のソースから来ていますか? – Ehz

答えて

1

私はソースSSISパッケージでこれを固定お勧めだろうが、私は次のように(WITHコマンドをサポートするバージョンの)Netazzaに働くと思います。 Netazzaがサポートしていないと思われる再帰は使用されないことに注意してください。

コマンドWITH()(ROW_NUMBERによって)数値seqeunceのいくつかの他のソースを使用することができ、その後はサポートされていない場合

セットアップ:

CREATE TABLE TableHave 
    (Name varchar(1), ID int, Value decimal(5,2)) 
; 

INSERT INTO TableHave 
    (Name, ID) 
VALUES 
    ('A', 1), 
    ('A', 4), 
    ('A', 7), 
    ('C', 21), 
    ('B', 23), 
    ('A', 25) 
; 

update TableHave set Value = id*1.12; 

問合せ:

;WITH 
Digits AS (
    SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL 
    SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
), 
Tally AS (
    SELECT 
      ones.digit 
     + tens.digit * 10 
     + hundreds.digit * 100 
     -- + thousands.digit * 1000 
     as num 
    FROM Digits ones 
    CROSS JOIN Digits tens 
    CROSS JOIN Digits hundreds 
    -- CROSS JOIN Digits thousands (keep adding more if needed) 
) 
select 
     d.id 
    , d.name 
    , t.value 
from (
    select 
      num + 1 as id 
     , case when num % 3 = 1 then 'B' 
       when num % 3 = 2 then 'C' 
       else 'A' 
      end Name 
     , coalesce(t.value,0) value 
    from Tally 
    where num <= (select ((max(id)/3)*3)+2 from TableHave) 
    ) d 
left join TableHave t on d.id = t.id 
order by d.id 

結果:

+----+------+-------+ 
| id | name | value | 
+----+------+-------+ 
| 1 | A | 1.12 | 
| 2 | B | 0  | 
| 3 | C | 0  | 
| 4 | A | 4.48 | 
| 5 | B | 0  | 
| 6 | C | 0  | 
| 7 | A | 7.84 | 
| 8 | B | 0  | 
| 9 | C | 0  | 
| 10 | A | 0  | 
| 11 | B | 0  | 
| 12 | C | 0  | 
| 13 | A | 0  | 
| 14 | B | 0  | 
| 15 | C | 0  | 
| 16 | A | 0  | 
| 17 | B | 0  | 
| 18 | C | 0  | 
| 19 | A | 0  | 
| 20 | B | 0  | 
| 21 | C | 23.52 | 
| 22 | A | 0  | 
| 23 | B | 25.76 | 
| 24 | C | 0  | 
| 25 | A | 28.00 | 
| 26 | B | 0  | 
| 27 | C | 0  | 
+----+------+-------+ 

実行中の例(SQL Server上)はここにありますhttp://rextester.com/VXB89713

+0

私はあなたのコードが好きで、またコードをオンラインで提供してくれてありがとう。 – TheEsnSiavashi

関連する問題