SQL Server-Abfrage - Auswahl von COUNT (*) mit DISTINCT

431

In SQL Server 2005 habe ich eine Tabelle cm_production, in der der gesamte Code aufgelistet ist, der in die Produktion aufgenommen wurde. Die Tabelle enthält eine Ticketnummer, einen Programmtyp sowie einen Programmnamen und eine Push-Nummer sowie einige andere Spalten.

ZIEL: Zählen Sie alle DISTINCT-Programmnamen nach Programmtyp und Push-Nummer

Was ich bisher habe ist:

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

Das bringt mich auf halbem Weg dorthin, aber es zählt alle Programmnamen, nicht die verschiedenen (was ich in dieser Abfrage nicht erwarte). Ich schätze, ich kann mich einfach nicht darum kümmern, wie ich ihm sagen soll, dass er nur die verschiedenen Programmnamen zählen soll, ohne sie auszuwählen. Oder so.

Somacore
quelle

Antworten:

729

Zählen Sie alle DISTINCT-Programmnamen nach Programmtyp und Push-Nummer

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(*)gibt für jede eindeutige Anzahl eine Zeile zurück. Was Sie wollen, ist COUNT(DISTINCT <expression>): wertet den Ausdruck für jede Zeile in einer Gruppe aus und gibt die Anzahl der eindeutigen Werte ungleich Null zurück.

Remus Rusanu
quelle
110

Ich musste die Anzahl der Vorkommen jedes einzelnen Werts ermitteln. Die Spalte enthielt Regionsinformationen. Die einfache SQL-Abfrage, mit der ich endete, war:

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

Welches würde mir eine Liste geben wie sagen:

Region, count
Denmark, 4
Sweden, 1
USA, 10
Netsi1964
quelle
hey @ Netsi1964 gleiche Abfrage wird verwendet, aber ich möchte Region, Bundesland, Anzahl, kann es möglich sein? Bitte helfen Sie mir
47

Sie müssen eine abgeleitete Tabelle für die verschiedenen Spalten erstellen und dann die Anzahl aus dieser Tabelle abfragen:

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

Hier dtist eine abgeleitete Tabelle.

venkatesh
quelle
1
Vielen Dank! Ich habe in meinem Leben viel SQL in vielen Datenbanken verwendet, und dies war das erste Mal, dass ich es als temporäre Tabelle mit "als X" qualifizieren musste.
Mmm
6
Beachten Sie, dass die normale Terminologie für "dt" hier abgeleitete Tabelle ist, nicht temporäre Tabelle
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
van
quelle
15

Versuche dies:

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.
quelle
-1

Dies ist ein gutes Beispiel, bei dem Sie die Anzahl der Pincodes abrufen möchten, die im letzten Adressfeld gespeichert sind

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