Buduję zapytanie z GROUP BY
klauzulą, która wymaga możliwości liczenia rekordów tylko na podstawie określonego warunku (np. Licz tylko rekordy, w których określona wartość kolumny jest równa 1).
SELECT UID,
COUNT(UID) AS TotalRecords,
SUM(ContractDollars) AS ContractDollars,
(COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM dbo.AD_CurrentView
GROUP BY UID
HAVING SUM(ContractDollars) >= 500000
COUNTIF()
Linia oczywiście nie powiedzie się, ponieważ nie ma natywna funkcja SQL nazywa COUNTIF
, ale idea jest tu określenie procentu wszystkich wierszy, które mają wartość „1” dla MyColumn.
Czy są jakieś przemyślenia, jak poprawnie zaimplementować to w środowisku MS SQL 2005?
sql
sql-server-2005
senfo
źródło
źródło
ISNULL
, zamiast tego możesz zrobićCASE WHEN myColumn IS NULL
lub użyćifnull
( stackoverflow.com/a/799406/1861346 )Zwykle robię to, co zalecił Josh, ale przeprowadziłem burzę mózgów i przetestowałem nieco hokerską alternatywę, którą chciałem się podzielić.
Możesz wykorzystać fakt, że COUNT (ColumnName) nie liczy wartości NULL i użyć czegoś takiego:
NULLIF - zwraca NULL, jeśli dwie przekazane wartości są takie same.
Zaleta: Wyraża zamiar COUNT wierszy zamiast notacji SUMA (). Wada: nie jest tak jasne, jak to działa („magia” jest zwykle zła).
źródło
ISNULL
w następujący sposób:SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Czekaj, to po prostu wygląda brzydko ...Użyłbym tej składni. Osiąga to samo, co sugestie Josha i Chrisa, ale ma tę zaletę, że jest zgodny z ANSI i nie jest powiązany z konkretnym dostawcą bazy danych.
źródło
NULLIF
dołączony jest standardowy SQL-92). Odpowiedź Josha można łatwo przekształcić w standardowy SQL, zastępującisnull
jąCOALESCE
.=
. Używam go do „policz liczbę odpowiedzi> = 2”.Dodając do odpowiedzi Josha,
U mnie zadziałało (w SQL Server 2012) bez zmiany „licznika” na „sumę”, a ta sama logika jest przenoszona na inne „agregacje warunkowe”. Np. Sumowanie na podstawie warunku:
źródło
Co powiesz na
Krótszy niż
CASE
:)Działa, ponieważ
COUNT()
nie liczy wartości null iIF
/CASE
zwraca wartość null, gdy warunek nie jest spełniony i nie maELSE
.Myślę, że to lepsze niż używanie
SUM()
.źródło
Nie jest to specyficzne dla produktu, ale standard SQL zapewnia
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
w tym celu. Lub coś, co bardzo to przypomina, nie wiem z góry mojego kapelusza.
I oczywiście dostawcy będą woleli trzymać się swoich zastrzeżonych rozwiązań.
źródło
FILTER
klauzulę, jest PostgreSQL, aleCASE
we wszystkich jest on emulowany .Dlaczego nie tak?
źródło
Musiałem użyć LICZ.JEŻELI () w moim przypadku jako część moich kolumn WYBIERZ ORAZ, aby naśladować% liczby przypadków, w których każdy element pojawił się w moich wynikach.
Więc użyłem tego ...
Oczywiście będziesz musiał sformatować wynik zgodnie z wymaganiami dotyczącymi wyświetlania.
źródło
źródło