SQL Server sorgusu - DISTINCT ile COUNT (*) seçme


431

SQL Server 2005'te üretime konulan tüm kodu listeleyen bir tablo cm_production var. Tabloda, diğer sütunlarla birlikte bir bilet_numarası, program_türü ve program_adı ve push_numarası vardır.

AMAÇ: Tüm DISTINCT program adlarını program türüne ve push numarasına göre sayın

Şimdiye kadar sahip olduğum şey:

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

Bu beni orada yarıya indirir, ancak tüm program isimlerini sayıyor, farklı olanları değil (ki bu sorguda yapmasını beklemiyorum). Sanırım kafamı seçmeden sadece farklı program adlarını saymasını nasıl söyleyeceğimi bilemiyorum. Ya da başka birşey.

Yanıtlar:


729

Tüm DISTINCT program adlarını program türüne ve push numarasına göre sayın

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(*)her benzersiz sayım için bir satır döndürür. İstediğiniz şey COUNT(DISTINCT <expression>): bir gruptaki her satır için ifadeyi değerlendirir ve benzersiz, boş olmayan değerlerin sayısını döndürür.


110

Her farklı değerin oluşum sayısını almam gerekiyordu. Sütunda Bölge bilgisi vardı. Sonunda basit SQL sorgusu:

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

Hangi bana şöyle bir liste verecek:

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

hey @ Netsi1964 aynı sorgu kullanılır ama Bölge, Devlet, Sayısı istiyorum, mümkün olabilir? Lütfen bana yardım et

48

Farklı sütunlar için türetilmiş bir tablo oluşturmanız ve ardından bu tablodaki sayımı sorgulamanız gerekir:

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

İşte dttüretilmiş bir tablo.


1
Teşekkür ederim! Birçok veritabanında hayatımda çok fazla SQL kullandım ve bu ilk kez "X" ile bir geçici tablo olarak nitelendirmek zorunda kaldım.
Mmm

6
Burada "dt" için normal terminolojinin türetildiğine dikkat edin geçici tablo değil tablo olduğunu unutmayın
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

bunu dene:

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

Bu, adres alanının son bölümünde depolanan Pin kodunu almak istediğiniz iyi bir örnektir

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.