Đếm số lượng hồ sơ được trả về bởi nhóm


138

Làm cách nào để tôi đếm số lượng bản ghi được trả về bởi một nhóm theo truy vấn,

Ví dụ:

select count(*) 
from temptable
group by column_1, column_2, column_3, column_4

Đưa cho tôi,

1
1
2

Tôi cần đếm các hồ sơ trên để có được 1 + 1 + 1 = 3.


3
@LorenVS: Nhưng điều đó sẽ cho tôi một số lượng hồ sơ trong bảng. Tôi cần số lượng hồ sơ sau khi nhóm xảy ra.
Chris

3
Nhóm không thay đổi số lượng hàng mặc dù. 1 + 1 + 2 (trong ví dụ của bạn) sẽ là số lượng hàng trong bảng. Bạn đang tìm kiếm 3? Số lượng nhóm khác nhau?
LorenVS

2
Một cách khác để hình thành câu hỏi: làm cách nào để chọn số cấp độ nhóm khác nhau cho một truy vấn nhất định?
Julian

Không phải lúc nào cũng rõ ràng lý do tại sao người dùng hỏi một câu hỏi, nhưng tôi đã đến đây vì tôi đang kiểm tra xem một cột trong chế độ xem là khóa chính hay khóa kết hợp. "Chọn tính (khác biệt COLUMNNAME) từ VIEWNAME", khi nhóm theo công việc nếu tôi có thể nhận được tổng số.
Ken Forslund

Câu trả lời:


169

Bạn có thể thực hiện cả hai trong một truy vấn bằng cách sử dụng mệnh đề OVER trên một COUNT khác

select
    count(*) RecordsPerGroup,
    COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4

Tôi biết đây là câu hỏi SQL-Server, nhưng để tham khảo: Điều này không hoạt động trên DB / 2 (trong trường hợp của tôi trên IBM iSeries). Xem nhận xét của tôi tại Thomas Câu trả lời
Bjinse

Làm thế nào tôi có thể lặp lại số đếm đó?
McDan Garrett

1
Mặt trái của giải pháp này là nó cung cấp cho bạn câu trả lời nhiều lần (cho mỗi kết hợp column_1, column_2, column_3, column_4). Điều này có thể hoặc không thể là một tác dụng phụ đáng kể, tùy thuộc vào cách bạn xử lý kết quả.
cartb Beforehorse

3
Để chỉ trả về số lượng bản ghi, hãy thêm một số (1) số được chọn (*) trên () là ....
Guilherme Campos Hazan

2
Trong trường hợp của tôi, sử dụng TOP (1) COUNT ( ) OVER () có hiệu năng truy vấn kém. Vì tôi chỉ cần số lượng các nhóm nên tôi đã thay đổi nhóm này thành DISTINCT COUNT ( ) OVER () và hiệu suất truy vấn được cải thiện đáng kể.
Joe Aldrich

71

Giải pháp đơn giản nhất là sử dụng bảng dẫn xuất:

Select Count(*)
From    (
        Select ...
        From TempTable
        Group By column_1, column_2, column_3, column_4
        ) As Z

Một giải pháp khác là sử dụng Đếm riêng biệt:

Select ...
    , ( Select Count( Distinct column_1, column_2, column_3, column_4 )
        From TempTable ) As CountOfItems
From TempTable
Group By column_1, column_2, column_3, column_4

Câu trả lời đầu tiên cũng hoạt động trên DB / 2, nhưng vì một số lý do, nó cần thêm AS TMP để hoạt động (như troutinator đã thêm)
Bjinse

5
@Bjinse - Một số DBMS sẽ yêu cầu tất cả các bảng dẫn xuất đều có bí danh. Tất cả họ sẽ chấp nhận nó để không bao gồm nó. Tôi sẽ thêm nó vào câu trả lời của tôi.
Thomas

25

Tôi biết nó khá muộn, nhưng không ai đề xuất điều này:

select count ( distinct column_1, column_2, column_3, column_4) 
from   temptable

Điều này hoạt động trong Oracle ít nhất - Tôi hiện không có cơ sở dữ liệu nào khác để kiểm tra và tôi không quá quen thuộc với cú pháp T-Sql và MySQL.

Ngoài ra, tôi không hoàn toàn chắc chắn liệu trình phân tích cú pháp có hiệu quả hơn theo cách này hay không, hoặc liệu giải pháp lồng nhau của câu lệnh chọn khác có tốt hơn không. Nhưng tôi thấy cái này thanh lịch hơn từ góc độ mã hóa.


Thomas thêm giải pháp của bạn vào câu trả lời của mình. Dù sao. Tôi không khuyên bạn nên làm điều này vì lý do bảo trì, các giải pháp khác đẹp hơn nhiều.
Gấu trúc Răzvan Flavius

@ RăzvanFlaviusPanda 1. Tại sao? Những gì đẹp hơn về các giải pháp khác? Nesting SQL dài dòng hơn và trong mắt tôi, lộn xộn và khó hiểu hơn (ergo khó duy trì hơn trong ý nghĩa hỗ trợ). Tôi hiểu rằng bạn có thể có một ưu tiên cho các cách khác, nhưng đó không phải là lý do để "đề xuất" nó theo sở thích của người khác. Thomas đã đưa ra một đề nghị tương tự, vâng, nhưng một lần nữa anh ta làm cho nó trông như thể lồng nhau SQL là một phần cần thiết của giải pháp, điều đó không phải.
cartb Beforehorse

12

Tôi đã cố gắng để đạt được điều tương tự mà không cần truy vấn con và có thể nhận được kết quả cần thiết như dưới đây

SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4

4

Một CTE làm việc cho tôi:

with cte as (
  select 1 col1
  from temptable
  group by column_1
)

select COUNT(col1)
from cte;

3

Làm thế nào về:

SELECT count(column_1)
FROM
    (SELECT * FROM temptable
    GROUP BY column_1, column_2, column_3, column_4) AS Records

1

Bạn có thể làm:

select sum(counts) total_records from (
    select count(*) as counts
    from temptable
    group by column_1, column_2, column_3, column_4
) as tmp

1

Trong PostgreSQL, nó hoạt động với tôi:

select count(count.counts) 
from 
    (select count(*) as counts 
     from table 
     group by concept) as count;

1

Bạn có thể thực thi đoạn mã dưới đây Nó đã làm việc trong Oracle.

SELECT COUNT(COUNT(*))
FROM temptable
GROUP BY column_1, column_2, column_3, column_4

1
Không thể chạy tổng hợp bên trong một tổng hợp trên máy chủ sql.
A. Greensmith

0

bạn cũng có thể nhận được bằng truy vấn dưới đây

select column_group_by,count(*) as Coulm_name_to_be_displayed from Table group by Column;

-- For example:
select city,count(*) AS Count from people group by city


0

Theo dõi PrestoDb , nơi FirstField có thể có nhiều giá trị:

select *
            , concat(cast(cast((ThirdTable.Total_Records_in_Group * 100 / ThirdTable.Total_Records_in_baseTable) as DECIMAL(5,2)) as varchar), '%') PERCENTage
from 
(
    SELECT FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable, count(*) Total_Records_in_Group
    FROM BaseTable FirstTable
    JOIN (
            SELECT FK1, count(*) AS Total_Records_in_baseTable 
            FROM BaseTable
            GROUP BY FK1
        ) SecondTable
    ON FirstTable.FirstField = SecondTable.FK1
    GROUP BY FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable
    ORDER BY FirstTable.FirstField, FirstTable.SecondField
) ThirdTable

-1

Làm thế nào về việc sử dụng hàm phân vùng COUNT OVER (PHẦN MỀM THEO {cột để nhóm theo}) trong SQL Server?

Ví dụ: nếu bạn muốn nhóm doanh số sản phẩm theo ItemID và bạn muốn đếm số lượng từng ItemID riêng biệt, chỉ cần sử dụng:

SELECT
{columns you want} ,
COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount ,
{more columns you want}... ,
FROM {MyTable}

Nếu bạn sử dụng phương pháp này, bạn có thể rời khỏi NHÓM THEO hình ảnh - giả sử bạn muốn trả lại toàn bộ danh sách (vì bạn có thể thực hiện báo cáo trong đó bạn cần biết toàn bộ số lượng vật phẩm bạn sẽ sắp xếp mà không cần phải có để hiển thị toàn bộ bộ dữ liệu, tức là Dịch vụ báo cáo).


Giá trị nào sẽ BandedItemCountchứa chính xác? Có khác nhau giữa các hàng đầu ra? Người hỏi đang tìm kiếm số lượng các cấp nhóm khác nhau.
Julian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.