我正在创建一个NACHA文件,如果文件中的记录数不是10的倍数,我们需要插入足够的“虚拟”记录,这些记录中填充了9个(replicate('9',94)
)以触及下一个数十个的地方。
我知道我可以写一个循环,或者填充一个包含10个9个记录的临时表并选择前N个。但这些选项感觉很笨。
我试图想出一个可以为我做的单一选择语句。有什么想法吗?
select nacha_rows
from NACHA_TABLE
union all
select replicate('9',94) --do this 0 to 9 times
答案 0 :(得分:1)
这应该有效。创建了一个包含9行虚拟数据的临时表。然后使用modulo确定应返回多少行。然后返回完整的数据集。如果你想要漂亮,你可以取出模数并在变量中计算一次。
;WITH dummydata (num, nines)
AS (SELECT 1 AS num, Replicate('9', 94)
UNION ALL
SELECT num + 1, Replicate('9', 94)
FROM dummydata
WHERE num < 9)
SELECT *
FROM nacha_table
UNION ALL
SELECT nines
FROM dummydata
WHERE num >= CASE
WHEN (SELECT Count(1) % 10 FROM nacha_table) = 0 THEN 10
ELSE (SELECT Count(1) % 10 FROM nacha_table)
END
答案 1 :(得分:1)
一个想法是准备9个填充行,而不仅仅添加到达下一个数十个相同的JChao想法所需的那些,具有不同的实现
With Filler AS (
SELECT n.n, replicate('9',94) nacha_rows
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)) n(n)
)
SELECT nacha_rows
FROM NACHA_TABLE
UNION ALL
SELECT nacha_rows
FROM Filler
OUTER APPLY (SELECT count(1) % 10 last
FROM NACHA_TABLE) l
WHERE filler.n + l.last <= 10
AND l.last > 0 -- to prevent filler line when NACHA_TABLE has exactly 10x rows
答案 2 :(得分:1)
公式(10-COUNT(*)%10)%10
告诉您要添加多少行,因此您只需从现有虚拟表中选择许多虚拟行。
SELECT nacha_rows
FROM NACHA_TABLE
UNION ALL
SELECT TOP (SELECT (10-COUNT(*)%10)%10 FROM NACHA_TABLE) REPLICATE('9',94)
FROM master.dbo.spt_values
答案 3 :(得分:0)
看起来你需要一个虚拟选择语句:
select '1' as [col1], 'abcdef' as [col 2]
union all
select '2' as [col1], 'abcdef' as [col 2]
union all
select '3' as [col1], 'abcdef' as [col 2]
union all
select '4' as [col1], 'abcdef' as [col 2]
答案 4 :(得分:0)
使用一组10行并加入的方式;
;with T(ord) as
(
select 1 as ord union all select ord + 1 from T where ord < 10
)
select isnull(nacha_rows, replicate('9', 94)) from T left join (
select
ROW_NUMBER() over (order by nacha_rows) row, nacha_rows
from NACHA_TABLE
) T2 on row = ord
修改强>;刚才意识到桌子当然可以有&gt;首先是10行,在这种情况下这不会起作用。