2014-06-24 51 views
4

我正在創建一個NACHA文件,如果文件中的記錄數不是10的倍數,我們需要插入足夠的「虛擬」記錄以填充9個(replicate('9',94))打到下一個十位。如何在沒有表的SELECT語句中返回N條記錄

我知道我可以編寫一個循環,也許可以填充一個臨時表,其中有10條記錄,並且選擇了最高的N.但是這些選項感覺很笨重。

我正試圖想出一個可以爲我做的select語句。有任何想法嗎?

select nacha_rows 
from NACHA_TABLE 
union all 
select replicate('9',94) --do this 0 to 9 times 

回答

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 
+0

是的!這正是它。它不是無表格,但使用最少的代碼很容易閱讀和維護。 –

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] 
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 

編輯;剛剛意識到,當然這張桌子可能有10行左右,在這種情況下,這將無法正常工作。

+0

這是一個非常聰明的解決方案。所以'ord <10'需要使用一個參數來定義總的期望行數。也就是說,如果我有34條記錄並需要40條記錄,我們會設置'ord <40'。它仍然創建一個臨時表,但以一種更簡單的方式。我只需要考慮一下,如果這比其他一些更詳細的解決方案更容易理解(並因此保持)。 –

+0

是的,所以你可以得到計數'declare @count int =(從NACHA_TABLE選擇count(*))'然後將'10'改爲'floor((@ count + 9)/ 10)* 10' –

1

這應該工作。用9行虛擬數據創建一個臨時表。然後使用模數來確定應該返回多少行。然後返回完整的數據集。如果你想讓它變得很漂亮,你可以把模塊取出來,並在變量中計算一次。

;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 
+0

這樣做技巧也是如此。並可能更容易維護。 –

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 

SQLFiddle demo

相關問題