显示具有0值的缺失行以维护订单

时间:2017-05-16 15:44:25

标签: sql postgresql netezza

我有一个名为列的表,其值为' A',' B'或者' C'。它们按顺序排列(A,B,C,A,B,C,......),但有时可能缺少名称(A,B,[缺少C] A,B,C,......)。我想要一个查询,按顺序为我提供所有名称,而不会丢失任何名称。缺少名称的值必须为0.

PS:该表位于Netezza数据库中,每次都被SSIS包截断并重新加载新数据。我们知道的是,还有一个ID列,其值介于1和27之间。但每次截断和加载后的行数可能不同。我想要的表格不需要ID列,但如果有,则需要从1到27,这意味着我想要的表格#39;必须总是有27行。

enter image description here

1 个答案:

答案 0 :(得分:1)

我建议在源SSIS包中修复此问题,但我认为以下内容适用于Netazza(适用于支持WITH命令的版本)。请注意,我没有使用递归,我相信Netazza不支持。

如果不支持WITH命令,则可以使用其他一些数字序列源(例如,通过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