admin

如何获得始终为n的倍数的sql查询?

sql

我需要获得一个查询结果,该结果将以确定数量的倍数显示(在我的情况下为10),而与实际行数无关(实际上是为了解决碧玉问题)。

例如,在此链接中,我构建了一个示例架构:http :
//sqlfiddle.com/#!3/c3dba/1/0

我希望结果是这样的:

1    Item 1     1    10
2    Item 2     2    30
3    Item 3     5    15
4    Item 4     2    10
null null null  null null
null null null  null null
null null null  null null
null null null  null null
null null null  null null
null null null  null null

我已经找到了这种解释,但是在SQLServer中不起作用,并且无法转换:http :
//community.jaspersoft.com/questions/514706/need-table-fixed-size-detail-
block


阅读 156

收藏
2021-06-07

共1个答案

admin

另一种选择是使用arecursive CTE获取预定的行数,然后使用nested CTE构造将来自递归CTE的行与原始表合并,最后使用TOP子句获取所需的行数。

DECLARE @n INT = 10

;WITH Nulls AS (
    SELECT 1 AS i
    UNION ALL
    SELECT i + 1 AS i
    FROM Nulls
    WHERE i < @n
),
itemsWithNulls AS
(
   SELECT * FROM itens 
   UNION ALL 
   SELECT NULL, NULL, NULL, NULL FROM Nulls    
)
SELECT TOP (@n) *
FROM itemsWithNulls

编辑:

通过更仔细地阅读需求,OP实际上希望返回的总行数 是10的倍数
。例如,如果表itens有4行,则应返回10行,如果表itens有12行,则应返回20行,依此类推。

在这种情况下,@n应设置为:

DECLARE @n INT = ((SELECT COUNT(*) FROM itens) / 10 + 1) * 10

实际上,我们可以使用嵌套的CTE将所有内容放入 单个sql语句中

;WITH NumberOfRows AS (
   SELECT n = ((SELECT COUNT(*) FROM itens) / 10 + 1) * 10
), Nulls AS (
    SELECT 1 AS i
    UNION ALL
    SELECT i + 1 AS i
    FROM Nulls
    WHERE i < (SELECT n FROM NumberOfRows)
),
itemsWithNulls AS
(
   SELECT * FROM itens 
   UNION ALL 
   SELECT NULL, NULL, NULL, NULL FROM Nulls    
)
SELECT TOP (SELECT n FROM NumberOfRows) *
FROM itemsWithNulls

sqlfiddle

2021-06-07