Sql Server 总是返回指定数量的记录

Cha*_*ams 1 sql sql-server sql-server-2008

我有一个查询,我总是想返回 10 条记录:

set rowcount 10
select row_number() over(order by count(*) desc) row_num
    ,hist_report_id
    ,max(rpt_report_name) report_name
from utility.dbo.tbl_report_history
join utility.dbo.tbl_report_definitions
    on hist_report_id = rpt_report_id
where hist_user_id = 1038
group by hist_report_id
Run Code Online (Sandbox Code Playgroud)

如果我有 10 条或更多记录,这很好用。问题是当记录少于 10 条时,我仍然需要在 report_id 和 report_name 字段中返回带有空值的 rownumber 字段。

如果只返回 7 条记录,结果应如下所示:

row_num report_id report_name
1       id1       name1
2       id2       name2
3       id3       name3
4       id4       name4
5       id5       name5
6       id6       name6
7       id7       name7
8       null      null
9       null      null
10      null      null
Run Code Online (Sandbox Code Playgroud)

有什么建议?

我正在使用 SQL Server 2008

gbn*_*gbn 5

count() 永远不能返回小于零...所以只需通过联合在计数列中附加 10 个带有 -1 的虚拟行

另外,不要使用 SET ROWCOUNT 因为它会影响中间结果

SELECT TOP 10
   row_number() over(order by TheCount desc) AS row_num,
   hist_report_id,
   report_name
FROM
    (
    select 
        ,count(*) AS TheCount
        ,hist_report_id
        ,max(rpt_report_name) AS report_name
    from 
       utility.dbo.tbl_report_history
       join 
       utility.dbo.tbl_report_definitions on hist_report_id = rpt_report_id
    where hist_user_id = 1038
    group by hist_report_id
    UNION ALL
    SELECT TOP 10
         -1, NULL, NULL
    FROM sys.columns
    ) T
Run Code Online (Sandbox Code Playgroud)