2017-05-16 29 views
1

我有一個表名稱列,其值爲'A','B'或'C'。它們按順序排列(A,B,C,A,B,C,...),但有時名字可能會丟失(A,B,[缺少C] A,B,C,...)。我想要一個查詢,爲我提供所有的名稱順序沒有任何缺少的名稱。缺失名稱的值必須爲0.使用0值顯示缺失的行以維護訂單

PS:該表位於Netezza數據庫中,每次通過SSIS包將其截斷並重新加載新數據。我們知道的是,ID列的值也介於1和27之間。但是,每個截斷和加載之後的行數可能不同。我想要的表不需要ID列,但是如果有的話,它會從1到27,這意味着'我想要的'表必須總是有27行。

enter image description here

+3

SQL表表示無序集。除非列指定了排序,否則沒有排序。你有這樣的專欄嗎? –

+0

@GordonLinoff謝謝你的迴應。我不確定我是否正確理解你的問題。但我沒有其他專欄。這些是爲應用程序提供的內容,應用程序需要按A,B,C順序讀取記錄。如果訂單沒有維護,它會崩潰。所以,如果缺失值,我們需要有A,B,C值爲0的值。 – TheEsnSiavashi

+1

在你的表格中,你如何確定A = 4與B = 1配對,A = 2.5與B = 3配對?這些值是否已經存在於沒有其他列的數據庫表中?還是他們來自另一個來源,如文本文件? – Ehz

回答

1

我會建議在源SSIS包修復這一點,但我覺得有以下將在Netazza工作(對於版本支持使用命令)。請注意,不會使用遞歸,我相信不支持Netazza。

如果不支持的命令WITH然後可以使用一個數字seqeunce的一些其他來源(例如,通過ROW_NUMBER())

設置:

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