Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Policzenie wszystkich rekordow + count i group by
sadu
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 25.04.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
kris2
post
Post #2





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 15.08.2007

Ostrzeżenie: (0%)
-----


Spróbuj użyc CUBE albo ROLLUP

http://databases.about.com/od/sql/l/aacuberollup.htm
Go to the top of the page
+Quote Post
mwojcik
post
Post #3





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
sadu
post
Post #4





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 25.04.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mwojcik
post
Post #5





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
sadu
post
Post #6





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 25.04.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mwojcik
post
Post #7





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:52