zliczanie wartości pól |
zliczanie wartości pól |
17.05.2013, 07:15:11
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
witam, mam tabele
grupa | ilosc gr1 | 3 gr2 | 2 gr3 | 6 gr1 | 2 gr2 | 4 chciałbym aby w wyniku zapytania otrzymać gr1 | 5 gr2 | 6 gr3 | 6 jest jakis operator zliczajacy wartosci pol dla danej grupy? koniecznie wartosci nie ilosc tj w przypadku COUNT(*) |
|
|
17.05.2013, 07:27:21
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) |
SUM
|
|
|
17.05.2013, 07:28:19
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
tak BTW - nie "ilosc" a "liczba" - wyraz ilość stosujemy do rzeczy "niepoliczalnych" - wiem wiem czepiam się -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
17.05.2013, 11:22:32
Post
#4
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
dzięki a tak przy okazji...
jakieś funkcje które policzą mi w kolejnej kolumnie procent z całości? |
|
|
17.05.2013, 12:53:05
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
Mnóstwo. Począwszy od wartosc/SUM(Wartosc), na funkcjach WINDOW skończywszy.
|
|
|
17.05.2013, 13:38:43
Post
#6
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
a jakieś przykłady? wertuje dokumentacje i nie natrafiłem narazie na nic sensownego
chciałbym aby w wyniku zapytania otrzymać gr1 | 5|29.41 gr2 | 6|35.29 gr3 | 6|35.29 kolumna 1 - grupa kolumna 2 - ilosc w grupie kolumna 3 - udział procentowy |
|
|
17.05.2013, 14:17:14
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Można to ogarnąć (najprościej IMO) podzapytaniem wybierającym sumę wszystkich z tabeli.
EDIT: nie "srednia" a "udzial" Ten post edytował Sephirus 17.05.2013, 14:20:11 -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
17.05.2013, 17:28:32
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
Sum w podselekcie z grupowaniem?? Nawet postgresa może to zarżnąć przy dużej ilości danych. Właśnie po to wymyślono funkcje WINDOW.
|
|
|
18.05.2013, 15:15:04
Post
#9
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
Sum w podselekcie z grupowaniem?? Nawet postgresa może to zarżnąć przy dużej ilości danych. Właśnie po to wymyślono funkcje WINDOW.
Ciekawe... a mozesz napisac co za co odpowiada? |
|
|
19.05.2013, 18:43:16
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
WITH tabela AS
( SELECT 'a' grupa, 5 ilosc UNION SELECT 'b', 6 UNION SELECT 'c', 6 ) Ten fragment zastępuje tabelę - nie miałem danych, więc musiałem je jakoś spreparować. Jak widać tabela nazywa się "tabela" i ma dwa pola "grupa", "ilosc". SELECT *, ilosc*100./sum(ilosc) over() FROM tabela To wyświetla wszystkie pola - * i dodatkowo jedno pole wyrażone przez ilosc*100./sum(ilosc) over() To pole to wartość pola "ilosc" razy (100.) - specjalnie z kropką na końcu, aby postgresql wiedział, że ma do czynienia z liczbą zmiennoprzecinkową. sum(ilosc) over() oblicza sumę pola ilosc dla WSZYSTKICH rekordów z tabeli. Musiałbyś doczytać co robi tak naprawdę OVER(), bo akurat tu jest proste - bez paraetrów. Może być np. sum(ilosc) over(partition by grupa order by grupa)... Ale dla sum jest to troche bez sensu. lepiej widać na rank(). |
|
|
20.05.2013, 07:32:07
Post
#11
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
WITH tabela AS ( SELECT 'a' grupa, 5 ilosc UNION SELECT 'b', 6 UNION SELECT 'c', 6 ) Ten fragment zastępuje tabelę - nie miałem danych, więc musiałem je jakoś spreparować. Jak widać tabela nazywa się "tabela" i ma dwa pola "grupa", "ilosc". SELECT *, ilosc*100./sum(ilosc) over() FROM tabela To wyświetla wszystkie pola - * i dodatkowo jedno pole wyrażone przez ilosc*100./sum(ilosc) over() To pole to wartość pola "ilosc" razy (100.) - specjalnie z kropką na końcu, aby postgresql wiedział, że ma do czynienia z liczbą zmiennoprzecinkową. sum(ilosc) over() oblicza sumę pola ilosc dla WSZYSTKICH rekordów z tabeli. Musiałbyś doczytać co robi tak naprawdę OVER(), bo akurat tu jest proste - bez paraetrów. Może być np. sum(ilosc) over(partition by grupa order by grupa)... Ale dla sum jest to troche bez sensu. lepiej widać na rank(). niestety nie zabardzo to dziala... mam taka tabele grupa| ilosc a | 2 a | 5 a | 6 b | 2 b | 5 b | 3 c | 1 c | 23 c | 3 a wynik potrzebuje: grupa| procent z calosci kolumny a | xxx b | xxx c | xxx a w twoim zapytaniu nie zlicza calosci grupy jedna grupa wystepuje po kilka razy w wyniku |
|
|
20.05.2013, 10:02:54
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
21.05.2013, 08:56:27
Post
#13
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
Najprostsza przeróbka to:
no ok ale sam pisales ze "...nawet postgresa moze to zarżnąć..." dlatego dopytuje o bardziej zaawansowane funkcje.. |
|
|
21.05.2013, 09:31:27
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
Nie.
Pisałem o czymś takim:
(o ile dobrze pamiętam to nazywa się zapytanie skorelowane) Jak widzisz dla każdego rekordu jest liczone Wynik tego jest czynnikiem dzielenia i na końcu to jest grupowane i sumowane. Pewnie optymalizator zapytań poradziłby sobie z tym, ale nie zawsze i nie na każdej bazie. Zresztą można to zamienić na takie zapytanie (jest równoważne):
Ale tu już sposób liczenia jest zupełnie inny - polecam zobaczyć plan zapytania (w PgAdmin "F7") dla wszystkich trzech zapytań. Nie sprawdzałem (z ciekawości zaraz to zrobię), ale myślę, że różnica będzie kosmiczna... |
|
|
5.06.2013, 14:11:22
Post
#15
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
witam, dalej podrąże temat
mam tabele: id_kontrahenta | adres zależy mi na tym aby wyciągnąć dane typu: 1 lokalizacja | 5 kontrahentów 2 lokalizacje | 15 lkontrahentów 3 lokalizacje | 5 kontrahentów no i wpadłem na pomysł : SELECT COUNT(idkh) ilosc FROM lokalizacja GROUP BY idkh ORDER BY ilosc DESC ; zapytanie pokazuje mozliwe wartości dla ilości lokalizacji... dodałem SELECT COUNT(COUNT(idkh)) io nie działa.. |
|
|
5.06.2013, 15:39:49
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
6.06.2013, 09:46:02
Post
#17
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
A konkretnie to co chcesz zrobić?
Robię statystyki i mam tabele "lokalizacja" w tabeli m. in. kolumny: "id" "adres".. i w 1 zapytaniu wypisuje ilóść lokalizacji danego "id" i z tym nie mam problemu.. W drugim muszę zrobić coś takiego że "pytam" o ilość "id" które mają 0, 1, 2, 3, 4... lokalizacje.. czyli najpierw sprawdzam jakie są możliwości czyli są "id" mające 1, 3, 4, 5, 7, 11, 14 lokalizacji i bok musze jakoś uzyskać ilość ich wystąpień... czyli np ilość lokalizacji | ilość "id" które mają tyle lokalizacji 1 | 10 .... 14 | 3 |
|
|
6.06.2013, 10:42:30
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
17.06.2013, 11:56:07
Post
#19
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 17.04.2013 Ostrzeżenie: (0%) |
Witam ponownie, mam takie oto zapytanie:
działa prawie tak jak tego chciałem, ale... z pierwszej kolumny pobiera znaczniki grup oraz ilości a z drugiej zamiast dodawać do tych pierwszych wyników dodaje nowe rekordy... wygląda to tak: A 11 1sze zapytanie B 2 1sze zapytanie C 23 1sze zapytanie A 2 2sze zapytanie B 7 2sze zapytanie C 45 2sze zapytanie a powinno byc po prostu: A 13 suma 1 i 2 zapytania B 9 suma 1 i 2 zapytania C 68 suma 1 i 2 zapytania |
|
|
17.06.2013, 13:42:47
Post
#20
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 03:15 |