Mam tabelę SQL Server zawierającą użytkowników i ich oceny. Dla uproszczenia powiedzmy, że istnieją 2 kolumny -name
& grade
. Tak więc typowym wierszem będzie Imię: „Jan Kowalski”, Ocena: „A”.
Szukam jednej instrukcji SQL, która znajdzie procenty wszystkich możliwych odpowiedzi. (A, B, C, itd ...) Ponadto, czy istnieje sposób na zrobienie tego bez definiowania wszystkich możliwych odpowiedzi (otwarte pole tekstowe - użytkownicy mogą wpisać „pass / fail”, „none”, itd.)
Ostateczny wynik, którego szukam, to A: 5%, B: 15%, C: 40% itd.
sql
sql-server
tsql
Alex
źródło
źródło
Najbardziej wydajne (przy użyciu over ()).
Uniwersalny (dowolna wersja SQL).
Z CTE najmniej wydajne.
źródło
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
działa świetnie na Postgresql 10Zamiast używać oddzielnego CTE do uzyskania sumy całkowitej, możesz użyć funkcji okna bez klauzuli „partition by”.
Jeśli używasz:
aby uzyskać licznik dla grupy, możesz użyć:
aby uzyskać całkowitą liczbę.
Na przykład:
Z mojego doświadczenia wynika, że jest szybszy, ale myślę, że w niektórych przypadkach może wewnętrznie używać tabeli tymczasowej (widziałem „Worktable”, gdy działałem z włączoną opcją „ustaw statystyki we”).
EDYCJA: Nie jestem pewien, czy moje przykładowe zapytanie jest tym, czego szukasz, tylko zilustrowałem, jak działają funkcje okienkowe.
źródło
tempdb
której znajduje się stół roboczy. Odczyty logiczne wydają się wyższe, ale są liczone inaczej niż normalnieCOUNT(*) OVER ()
zapytanie w zapytaniu zwróci całkowicie niepowiązaną liczbę (w szczególności liczbę wierszy w zgrupowanym zestawie wyników). Zamiast tego powinieneś użyćSUM(COUNT(*)) OVER ()
.Musisz obliczyć sumę ocen. Jeśli jest to SQL 2005, możesz użyć CTE
źródło
Musisz zgrupować w polu oceny. To zapytanie powinno dać ci to, czego szukasz w prawie każdej bazie danych.
Powinieneś określić system, którego używasz.
źródło
Po prostu używam tego, gdy muszę wyliczyć procent.
Zwróć uwagę, że 100.0 zwraca liczby dziesiętne, podczas gdy 100 samo w sobie zaokrągli wynik do najbliższej liczby całkowitej, nawet z funkcją ROUND ()!
źródło
Poniższe powinny działać
EDYCJA: Przeniesiono
* 100
i dodano,1.0
aby upewnić się, że nie wykonuje dzielenia liczb całkowitychźródło
Uważam, że jest to rozwiązanie ogólne, chociaż testowałem je na serwerze IBM Informix Dynamic Server 11.50.FC3. Następujące zapytanie:
daje następujący wynik na danych testowych pokazanych poniżej linii poziomej.
ROUND
Funkcja może być DBMS specyficzne, ale reszta (chyba) nie jest. (Zauważ, że zmieniłem 100 na 100.0, aby upewnić się, że obliczenia są wykonywane przy użyciu niecałkowitych - DECIMAL, NUMERIC - arytmetyczne; zobacz komentarze i podziękowania dla Thunder.)źródło
źródło
W dowolnej wersji serwera sql możesz użyć zmiennej dla sumy wszystkich ocen, takiej jak ta:
źródło
Możesz użyć podselekcji w zapytaniu z zapytania (nieprzetestowane i nie wiesz, która jest szybsza):
Lub
Lub
Możesz także użyć procedury składowanej (przepraszam za składnię Firebird):
źródło
Miałem podobny problem do tego. powinieneś być w stanie uzyskać poprawny wynik mnożąc przez 1,0 zamiast 100.Patrz przykład Obraz w załączeniu
Wybierz ocenę, (Count (Grade) * 1.0 / (Select Count (*) From MyTable)) jako wynik z MyTable Group By Grade
źródło
Ten działa dobrze w MS SQL. Przekształca varchar w wynik zmiennoprzecinkowy z ograniczeniem do dwóch miejsc po przecinku.
źródło