Truy vấn SQL Server - Chọn COUNT (*) với DISTINCT


431

Trong SQL Server 2005, tôi có một bảng cm_production liệt kê tất cả các mã được đưa vào sản xuất. Bảng này có một Ticket_number, program_type và program_name và push_number cùng với một số cột khác.

MỤC TIÊU: Đếm tất cả các tên chương trình DISTINCT theo loại chương trình và số đẩy

Những gì tôi có cho đến nay là:

DECLARE @push_number INT;
SET @push_number = [HERE_ADD_NUMBER];

SELECT DISTINCT COUNT(*) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

Điều này đưa tôi đến một phần ở đó, nhưng nó đếm tất cả các tên chương trình, không phải tên riêng biệt (mà tôi không mong đợi nó sẽ thực hiện trong truy vấn đó). Tôi đoán tôi chỉ không thể quấn đầu xung quanh làm thế nào để nói với nó chỉ đếm các tên chương trình riêng biệt mà không chọn chúng. Hoặc một cái gì đó.

Câu trả lời:


729

Đếm tất cả các tên chương trình DISTINCT theo loại chương trình và số đẩy

SELECT COUNT(DISTINCT program_name) AS Count,
  program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

DISTINCT COUNT(*)sẽ trả về một hàng cho mỗi số đếm duy nhất. Những gì bạn muốn là COUNT(DISTINCT <expression>): đánh giá biểu thức cho mỗi hàng trong một nhóm và trả về số lượng giá trị duy nhất, không null.


110

Tôi cần phải có được số lần xuất hiện của mỗi giá trị riêng biệt. Cột chứa thông tin khu vực. Truy vấn SQL đơn giản mà tôi đã kết thúc là:

SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region

Mà sẽ cho tôi một danh sách như, nói:

Region, count
Denmark, 4
Sweden, 1
USA, 10

hey @ Netsi1964 cùng một truy vấn được sử dụng nhưng tôi muốn Vùng, Bang, Đếm, điều đó có thể được không? Xin hãy giúp tôi

47

Bạn phải tạo một bảng dẫn xuất cho các cột riêng biệt và sau đó truy vấn số đếm từ bảng đó:

SELECT COUNT(*) 
FROM (SELECT DISTINCT column1,column2
      FROM  tablename  
      WHERE condition ) as dt

Đây dtlà một bảng dẫn xuất.


1
Cảm ơn bạn! Tôi đã sử dụng rất nhiều SQL trong cuộc sống của mình trên rất nhiều cơ sở dữ liệu và đây là lần đầu tiên tôi phải đủ điều kiện làm bảng tạm thời với "as X".
Mmm

6
Lưu ý rằng thuật ngữ thông thường cho "dt" ở đây là bảng có nguồn gốc , không phải bảng tạm thời
8forty

17
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

15

thử cái này:

SELECT
    COUNT(program_name) AS [Count],program_type AS [Type]
    FROM (SELECT DISTINCT program_name,program_type
              FROM cm_production 
              WHERE push_number=@push_number
         ) dt
    GROUP BY program_type

-1

Đây là một ví dụ điển hình khi bạn muốn lấy số lượng Pincode được lưu trữ trong trường địa chỉ cuối cùng

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)

-6
select  count (distinct NumTar),'PROPIAS'
from ATM_TRANe with (nolock)
where Fecha>='2014-01-01'
  AND Fecha<='2015-05-31'and NetDestino=0
  and SystemCodResp=0
group by NetDestino 
union 
select sum (contar),'FORANEAS'
from  
(
  select  count(distinct NumTar) as contar
  from ATM_TRANe with (nolock)
  where Fecha>='2014-01-01'
    AND Fecha<='2014-01-31'
    and NetDestino!=0
    and SystemCodResp=0
  group by NetDestino
)dt
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.