【问题标题】:Get row count including column values in sql server获取行数,包括sql server中的列值
【发布时间】:2011-12-27 07:45:19
【问题描述】:

我需要获取查询的行数,并在一个查询中获取查询的列。计数应该是结果列的一部分(所有行都应该相同,因为它是总数)。

例如,如果我这样做: select count(1) from table 我可以得到总行数。

如果我这样做: select a,b,c from table 我将获取查询的列值。

我需要的是用一种非常有效的方式在一个查询中获取计数和列值。

例如: select Count(1), a,b,c from table 没有分组,因为我想要总数。

我发现的唯一方法是创建一个临时表(使用变量),插入查询结果,然后计数,然后返回两者的连接。但是,如果结果有数千条记录,那效率就不是很高了。

有什么想法吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    你可以这样做:

    SELECT x.total, a, b, c
     FROM 
        table
        JOIN (SELECT total = COUNT(*) FROM table) AS x ON 1=1
    

    这将返回第一列中的记录总数,然后是字段 a、b 和 c

    【讨论】:

    • 和第一个一样,我尽量避免重复查询,谢谢。
    【解决方案2】:

    查看 SQL Server 的 Ranking 函数。

    SELECT ROW_NUMBER() OVER (ORDER BY a) AS 'RowNumber', a, b, c
    FROM table;
    

    【讨论】:

    • OP 希望每一行的值相同;这将为每一行提供一个唯一的序列号。
    【解决方案3】:

    使用CROSS JOIN

        SELECT a.*, b.numRows
          FROM YOUR_TABLE a
    CROSS JOIN (SELECT COUNT(*) AS numRows
                  FROM YOUR_TABLE) b
    

    【讨论】:

    • 谢谢,这会让我做两次查询....我试图避免这种情况,但我还没有找到办法。
    【解决方案4】:

    @Jim H 几乎是对的,但是选择了错误的排名函数:

    create table #T (ID int)
    insert into #T (ID)
    select 1 union all
    select 2 union all
    select 3
    select ID,COUNT(*) OVER (PARTITION BY 1) as RowCnt from #T
    drop table #T
    

    结果:

    ID  RowCnt
    1   3
    2   3
    3   3
    

    按常数进行分区使其计数整个结果集。

    【讨论】:

    • 这似乎是唯一一个我不必重复查询的地方,但它引发了关于性能的问题!我坚持使用这个解决方案。
    • 仅供参考,您也可以使用空的 OVER 子句stackoverflow.com/a/5147055/27535
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2021-04-22
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多