2011-11-11 33 views
5

Tôi cần nhận số lượng truy vấn của hàng và cũng nhận được các cột của truy vấn trong một truy vấn đơn lẻ. Số đếm phải là một phần của các cột của kết quả (Nó phải giống nhau cho tất cả các hàng, vì nó là tổng số).Nhận số hàng bao gồm các giá trị cột trong máy chủ sql

ví dụ: nếu tôi làm như vậy: select count(1) from table Tôi có thể có tổng số hàng.

Nếu tôi làm điều này: select a,b,c from table Tôi sẽ nhận được các giá trị của cột cho truy vấn.

Điều tôi cần là nhận số lượng và giá trị cột trong một truy vấn, với cách rất hiệu quả.

Ví dụ: select Count(1), a,b,c from table không có nhóm nào, vì tôi muốn tổng số.

Cách duy nhất tôi tìm thấy là làm bảng tạm thời (sử dụng biến), chèn kết quả truy vấn, sau đó đếm, sau đó trả về kết hợp của cả hai. Nhưng nếu kết quả nhận được hàng ngàn hồ sơ, điều đó sẽ không hiệu quả lắm.

Bất kỳ ý tưởng nào?

Trả lời

8

@Jim H là gần như ngay, nhưng chọn chức năng xếp hạng sai:

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 

Kết quả:

ID RowCnt 
1 3 
2 3 
3 3 

Phân vùng bằng một liên tục làm cho nó đếm trên toàn bộ kết quả.

+0

Điều này có vẻ là người duy nhất mà tôi không phải sao chép truy vấn, nhưng nó đặt ra câu hỏi về hiệu suất! Tôi đang ở với giải pháp này. –

+1

FYI, bạn có thể sử dụng mệnh đề OVER trống quá http://stackoverflow.com/a/5147055/27535 – gbn

0

Bạn có thể làm điều đó như thế này:

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

đó sẽ trở lại với tổng số bản ghi trong cột đầu tiên, tiếp theo là lĩnh vực a, b & c

+0

Giống như lần đầu tiên, tôi đang cố gắng tránh trùng lặp truy vấn, dù sao đi nữa. –

1

Nhìn vào Ranking chức năng của SQL Máy chủ.

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

OP muốn cùng một giá trị cho mỗi hàng; điều này sẽ cung cấp một số thứ tự, duy nhất cho mỗi hàng. –

5

Sử dụng CROSS JOIN:

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

Thankx, điều này sẽ làm cho tôi làm các truy vấn hai lần mặc dù .... Tôi đang cố gắng để tránh điều này, nhưng tôi đã không tìm thấy một cách. –

Các vấn đề liên quan