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.

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.


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

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.


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

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

-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)

-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.