Zapytanie programu SQL Server - wybranie COUNT (*) za pomocą DISTINCT


431

W SQL Server 2005 mam tabelę cm_production, która zawiera cały kod, który został wprowadzony do produkcji. Tabela ma numer_kasku, typ_programu, nazwę_programu i numer_pchnięcia wraz z kilkoma innymi kolumnami.

CEL: Policz wszystkie nazwy programów DISTINCT według typu programu i numeru push

Do tej pory mam:

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

To prowadzi mnie do częściowego zejścia, ale zlicza wszystkie nazwy programów, a nie te odrębne (czego nie oczekuję, że zrobi to w tym zapytaniu). Wydaje mi się, że po prostu nie mogę zawinąć głowy, żeby powiedzieć, żeby liczyć tylko różne nazwy programów bez ich wybierania. Lub coś.

Odpowiedzi:


729

Policz wszystkie nazwy programów DISTINCT według typu programu i numeru 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(*)zwróci wiersz dla każdej unikalnej liczby. Co chcesz COUNT(DISTINCT <expression>): ocenia wyrażenie dla każdego wiersza w grupie i zwraca liczbę unikatowych wartości innych niż null.


110

Musiałem uzyskać liczbę wystąpień każdej odrębnej wartości. Kolumna zawierała informacje o regionie. Proste zapytanie SQL, z którym skończyłem, to:

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

Co dałoby mi listę, na przykład:

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

hej @ Netsi1964 używane jest to samo zapytanie, ale chcę Region, Stan, Licz, czy to możliwe? Proszę o pomoc

48

Musisz utworzyć tabelę pochodną dla odrębnych kolumn, a następnie sprawdzić liczbę z tej tabeli:

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

Oto dttabela pochodna.


1
Dziękuję Ci! Używałem dużo SQL w moim życiu w wielu bazach danych i po raz pierwszy musiałem zakwalifikować go jako tabelę tymczasową z „as X”.
Mmm

6
Zauważ, że normalną terminologią dla „dt” tutaj jest tabela pochodna , a nie tabela tymczasowa
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

Spróbuj tego:

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

To dobry przykład, w którym chcesz uzyskać liczbę kodów PIN zapisanych w ostatnim polu adresu

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.