Permintaan SQL Server - Memilih COUNT (*) dengan DISTINCT

431

Di SQL Server 2005 saya memiliki tabel cm_production yang mencantumkan semua kode yang telah dimasukkan ke dalam produksi. Tabel ini memiliki ticket_number, program_type, dan program_name dan push_number bersama dengan beberapa kolom lainnya.

TUJUAN: Hitung semua nama program DISTINCT berdasarkan jenis program dan nomor push

Sejauh ini yang saya miliki adalah:

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

Ini membuat saya setengah jalan di sana, tapi itu menghitung semua nama program, bukan yang berbeda (yang saya tidak harapkan untuk dilakukan dalam permintaan itu). Saya kira saya hanya tidak bisa membungkus kepala saya di sekitar bagaimana mengatakannya hanya menghitung nama program yang berbeda tanpa memilihnya. Atau sesuatu.

Somacore
sumber

Jawaban:

729

Hitung semua nama program DISTINCT berdasarkan jenis program dan nomor push

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(*)akan mengembalikan satu baris untuk setiap hitungan unik. Apa yang Anda inginkan adalah COUNT(DISTINCT <expression>): mengevaluasi ekspresi untuk setiap baris dalam grup dan mengembalikan jumlah nilai unik, bukan nol.

Remus Rusanu
sumber
110

Saya perlu mendapatkan jumlah kemunculan dari setiap nilai yang berbeda. Kolom berisi info Wilayah. Query SQL sederhana yang saya akhiri adalah:

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

Yang akan memberi saya daftar seperti, katakan:

Region, count
Denmark, 4
Sweden, 1
USA, 10
Netsi1964
sumber
hey @ Netsi1964 permintaan yang sama digunakan tetapi saya ingin Region, State, Count, apakah mungkin? Tolong bantu saya
48

Anda harus membuat tabel turunan untuk kolom yang berbeda dan kemudian meminta hitungan dari tabel itu:

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

Ini dtadalah tabel turunan.

venkatesh
sumber
1
Terima kasih! Saya telah menggunakan banyak SQL dalam hidup saya di banyak database, dan ini adalah pertama kalinya saya harus memenuhi syarat sebagai tabel temp dengan "sebagai X".
Mmm
6
Perhatikan bahwa terminologi normal untuk "dt" di sini adalah tabel turunan , bukan tabel temp
8fort
17
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type
mobil van
sumber
15

coba ini:

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
KM.
sumber
-1

Ini adalah contoh yang bagus di mana Anda ingin mendapatkan hitungan Pincode yang disimpan di bidang alamat terakhir

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)
Uday Phadke
sumber
-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
Taryn
sumber