2011-11-11 104 views
5

我需要獲取查詢的行數,並且還可以在一個查詢中獲取查詢的列。計數應該是結果列的一部分(對於所有行應該是相同的,因爲它是總數)。獲取行計數,包括sql服務器中的列值

例如,如果我這樣做: select count(1) from table 我可以有總的行數。

如果我這樣做: select a,b,c from table 我會得到查詢的列值。

我需要的是以一種非常有效的方式獲取一個查詢中的計數和列值。

例如: select Count(1), a,b,c from table 沒有分組,因爲我想要總數。

我發現的唯一方法是做一個臨時表(使用變量),插入查詢的結果,然後計數,然後返回兩者的連接。但是如果結果得到數千條記錄,那麼效率就不高。

任何想法?

回答

8

@Jim H是差不多吧,但是選擇了錯誤的排名功能:通過

ID RowCnt 
1 3 
2 3 
3 3 

分區:

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 

結果常數使其數在整個結果集上。

+0

這似乎是唯一一個我不必複製查詢的地方,但它引發了關於性能的問題!我留在這個解決方案。 –

+1

僅供參考,您也可以使用空的OVER子句http://stackoverflow.com/a/5147055/27535 – gbn

0

你可以做這樣的:

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

將在第一列返回的記錄總數,其次是場A,B &Ç

+0

與第一個相同,我試圖避免重複查詢,thankx無論如何。 –

1

看看SQL的Ranking功能服務器。

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

OP要求每行的值相同;這將爲每一行提供一個唯一的序列號。 –

5

使用CROSS JOIN

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

Thankx,這會讓我做兩次查詢,雖然....我試圖避免這一點,但我還沒有找到一種方法。 –