2013-09-23 15 views
16

Mam tabelę, VehicleModelYear, zawierającą identyfikator kolumny, rok, marka i model.WYBIERZ COUNT (DISTINCT ...) błąd w wielu kolumnach?

dwóch następujących zapytań działa zgodnie z oczekiwaniami:

SELECT DISTINCT make, model 
FROM VehicleModelYear 

SELECT COUNT(DISTINCT make) 
FROM VehicleModelYear 

Jednak ta kwerenda nie działa

SELECT COUNT(DISTINCT make, model) 
FROM VehicleModelYear 

To jasne, że odpowiedź jest liczba wyników zwracanych przez pierwszego zapytania, ale Zastanawiam się, co jest nie tak z tą składnią lub dlaczego nie działa.

+0

możliwym duplikatu [Zliczanie DISTINCT nad wielu kolumn ] (http://stackoverflow.com/questions/1471250/counting-distinct-over-multiple-c olumns) –

Odpowiedz

32

COUNT() w SQL Server przyjmuje następującą składnię

COUNT(*) 
COUNT(colName) 
COUNT(DISTINCT colName) 

Można mieć podkwerenda która zwraca unikalny zestaw make i model że można liczyć ze.

SELECT COUNT(*) 
FROM 
     (
      SELECT DISTINCT make, model 
      FROM VehicleModelYear 
     ) a 

"a" na końcu nie jest literówką. Jest to alias, bez którego SQL spowoduje błąd ERROR 1248 (42000): Every derived table must have its own alias.

+0

działa również w MySQL, dzięki! – by0

5

Składnia jest poprawna, ale nie została zaimplementowana w SQL-Server.

Spróbuj przepisać:

; WITH cte AS 
    (SELECT DISTINCT make, model 
    FROM VehicleModelYear 
) 
SELECT COUNT(*) AS total 
FROM cte ; 

czyli

; WITH cte AS 
    (SELECT COUNT(DISTINCT model) AS cnt 
    FROM VehicleModelYear 
    GROUP BY make 
) 
SELECT SUM(cnt) AS total 
FROM cte ; 

czyli

; WITH cte AS 
    (SELECT NULL AS n 
    FROM VehicleModelYear 
    GROUP BY make, model 
) 
SELECT COUNT(*) AS total 
FROM cte ; 

i wreszcie, 2. i 3. zapytanie powyżej modyfikowany, bez podkwerend:

SELECT DISTINCT 
    SUM(COUNT(DISTINCT model)) OVER() AS total 
FROM VehicleModelYear 
GROUP BY make ; 

SELECT DISTINCT COUNT(*) OVER() AS total 
FROM VehicleModelYear 
GROUP BY make, model ; 

Opóźnienia uzupełnienia przez @Alexander Fedorenko:

SELECT TOP (1) 
    SUM(COUNT(DISTINCT model)) OVER() AS total 
FROM VehicleModelYear 
GROUP BY make ; 

SELECT TOP (1) COUNT(*) OVER() AS total 
FROM VehicleModelYear 
GROUP BY make, model ; 

lub:

; WITH cte AS 
    (SELECT DENSE_RANK() OVER(ORDER BY make, model) AS dr 
    FROM VehicleModelYear 
) 
SELECT MAX(dr) AS total 
FROM cte ; 
+0

To ma sens, dziękuję! – csab

18

Spróbuj łącząc je w jednym polu:

SELECT COUNT(DISTINCT make + ' ' + model) 
FROM VehicleModelYear 
+1

sprytny ':)' ..... –

+9

lub 'WYBIERZ LICZBĘ (DISTINCT CHECKSUM (marka, model)) FROM VehicleModelYear'A –

+0

@ TimSchmelter schludny! –

Powiązane problemy