Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Policzenie wszystkich rekordow + count i group by
Forum PHP.pl > Forum > Bazy danych
sadu
Heja

Mam nastepujaca tabele "results"

results :
id
value
question_id

i chce policzyc jednym zapytaniem jednoczesnie ilosc wszystkich rekordow w bazie + rekordy pogrupowane wedlug pola "value"

Myslalem nad czyms takm, ale nie dziala:

  1. SELECT count( `question_id` ) AS liczba, sum(liczba), value
  2. FROM results GROUP BY value



Z gory dzieki za pomoc
kris2
Spróbuj użyc CUBE albo ROLLUP

http://databases.about.com/od/sql/l/aacuberollup.htm
mwojcik
Oprocz wymienionych sposobow podanych przez @kris2 mozesz zrobic to co potrzebujesz za pomoca jednego zapytania SQL, gdyz nie wszystkie RDBMSy maja zaimplementowane wyzej wymienione funkcje.
Jak rozumiem chcesz pogrupowac dane z kolumny "value" wzgledem kolumny "question_id".
Przede wszystkim nalezy pogrupowac dane wzgledem "question_id", a nie "value" ("value" jest kolumna agregowana, wiec nie moze byc grupowania wedlug tej kolumny). Zapytanie bedzie wygladalo nastepujaco :
  1. SELECT SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id

Jako wynik otrzymamy tabele zawierajaca sume wszystkich wartosci value dla poszczegolnych wartosci pola question_id.
Cytat
chce policzyc jednym zapytaniem jednoczesnie ilosc wszystkich rekordow w bazie

Chyba chodzilo ci o ilosc wszystkich rekordow w tabeli "results" a nie w calej bazie.
Dodanie count(*) do pytania
  1. SELECT COUNT(*) AS ilosc_rekordow, SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id

jest bledne. Dlaczego ? W wyniku da tabele, w ktorej w kolumnie "ilosc_rekordow" dane bede zagregowane dla kazdego "question_id", czyli w kazdej krotce bedzie zliczona ilosc wystapien tego samego "question_id", a nie calkowita ilosc rekordow w tabeli. Zeby osiagnac to, czego chcemy, nalezy uzyc podazytania :
  1. SELECT (SELECT count(*) FROM results) AS ilosc_rekordow, SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id
sadu
fakt to rozwiazuje problem, ale zastanawialem sie czy da sie to zrobic jednym zapytaniem wykorzystujac jakis sprytnu sposob... zapytanie zaproponowane przezemnie pobiera wszystkie wiersze... po czym je grupuje, wiec wydaje sie ze jest to mozliwe bez dodatkowego ( nawet zagnierzdzonego ) zapytania.
mwojcik
Cytat(sadu @ 16.08.2007, 01:04:21 ) *
Heja

Mam nastepujaca tabele "results"

results :
id
value
question_id

i chce policzyc jednym zapytaniem jednoczesnie ilosc wszystkich rekordow w bazie + rekordy pogrupowane wedlug pola "value"

Myslalem nad czyms takm, ale nie dziala:

  1. SELECT count( `question_id` ) AS liczba, sum(liczba), value
  2. FROM results GROUP BY value

Z gory dzieki za pomoc


Do tego zapytania jeszcze sie odniose - uzywasz tutaj sumowania na kolumnie "liczba" a wyzej nie wymieniles, zeby taka kolumna znajdowala sie w tabeli "results". Oprocz tego napisales, ze chcesz wydobyc ilosc wszystkich rekordow w bazie, a uzywasz w zapytanie "count(question_id)", a to niekoniecznie musi zwrocic ilosc rekordow w tabeli (bo chyba o nia ci chodzilo) - jezeli ktoras z wartosci question_id bedzie NULL to wtedy "count" tego nie policzy - lepiej liczyc ilosc kluczy glownej w tabeli (tutaj "id") albo wszystkich wszystkich kolumn ("count(*)") - chyba ze masz poprawnie skonstruowana relacje, w ktorej "question_id" jest kluczem obcem jakies innej tabeli i ma ustawiona wlasciwosc "NOT NULL".
Moze przedstaw jakies przykladowe dane z tej tabeli i napisz jakie chcialbys wyniki - wtedy latwiej bedzie skonstruowac zapytanie, bo prawde mowiac nadal nie za bardzo rozumiem co chcesz osiagnac.
sadu
Moja propozycja zapytania:

  1. SELECT count( `question_id` ) AS liczba, sum(liczba), value
  2. FROM results GROUP BY value


To zapytanie policzy mi wystepowanie question_id (PK) w tabeli result pogrupowane wedlug wartosci (value)... z tym ze chce dodatkowo policzyc % danej pozycji czyli dla value "cos" = 3% aby to zrobiec musze wiedziec ile jest wszystkich wierszy... myslalem ze jak policze sobie countem i nadam alias o nazwie liczba (count( `question_id` ) AS liczba) a pozniej uzyje funkcji sum(liczba) to cos z tego bedzie ale mysql nie kuma o co mi chodzi...

Mam nadzieje ze teraz bardziej zrozumiale
mwojcik
Hmm... nadal nie rozumiem - chcesz policzyc wartosc procentowa, ale czego dokladnie?
MySQL nie przetworzy tego zapytania, bo nie wie, co to jest za kolumna "liczba". Musisz uzyc podzapytania, zeby utworzyc z niej alias.
  1. SELECT rr.ilosc, SUM( rr.ilosc ) , r.value FROM results AS r, (SELECT count( question_id ) AS ilosc FROM results ) AS rr GROUP BY r.value

ale nie wiem czy to jest to o co ci chodzilo.
Jak mozesz to napisz od strony logiki biznesowej do czego sluza dane, ktore tam trzymasz i co chcesz za ich pomoca osiagnac. I najlepiej bedzie, tak jak juz wspomnialem poprzednio, podaj jakies przykladowe dane i wynik jaki chcesz dostac.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.