显示具有 0 值的缺失行以维持顺序
Show missing rows with 0 values to maintain the order
我有一个 table,其名称列的值为 'A'、'B' 或 'C'。它们按顺序排列(A、B、C、A、B、C、...),但有时可能会缺少名称(A、B、[缺少 C] A、B、C、...)。我想要一个查询,按顺序给我所有的名字,没有任何遗漏的名字。缺少名称的值必须为 0。
PS:table 位于 Netezza 数据库中,每次被 SSIS 包截断并重新加载新数据。我们知道还有一个 ID 列,其值介于 1 和 27 之间。但每次截断和加载后的行数可能不同。我想要的 table 不需要 ID 列,但如果有,它将是从 1 到 27,这意味着 'table I want' 必须始终有 27 行。
我建议在源 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 服务器上)http://rextester.com/VXB89713
我有一个 table,其名称列的值为 'A'、'B' 或 'C'。它们按顺序排列(A、B、C、A、B、C、...),但有时可能会缺少名称(A、B、[缺少 C] A、B、C、...)。我想要一个查询,按顺序给我所有的名字,没有任何遗漏的名字。缺少名称的值必须为 0。
PS:table 位于 Netezza 数据库中,每次被 SSIS 包截断并重新加载新数据。我们知道还有一个 ID 列,其值介于 1 和 27 之间。但每次截断和加载后的行数可能不同。我想要的 table 不需要 ID 列,但如果有,它将是从 1 到 27,这意味着 'table I want' 必须始终有 27 行。
我建议在源 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 服务器上)http://rextester.com/VXB89713