我需要获得一个查询结果,该结果将以确定数量的倍数显示(在我的情况下为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
另一种选择是使用arecursive CTE获取预定的行数,然后使用nested CTE构造将来自递归CTE的行与原始表合并,最后使用TOP子句获取所需的行数。
recursive CTE
nested 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行,依此类推。
itens
在这种情况下,@n应设置为:
@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