Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Pomoc w budowie selecta zwracającej %
Forum PHP.pl > Forum > Bazy danych
neverever
mam mały zgryz ze zbudowaniem selecta zwracającego wynik w %.

Mam taką oto tabelę
pola: TYP, PODTYP (przyjmują wartość w zakresie 1-99), VAR1, VAR2, VAR3 (wartość 1 lub 2)
Rekordów takich docelowo będzie całkiem sporo.

Teraz chcę zrobić coś takiego, że wybieram sobie TYP i PODTYP i dla nich zwraca mi:
ile % VAR1 = 1
ile % VAR2 = 1
ile % VAR3 = 1

Jak coś takiego zrobić w jednym zapytaniu?
piotrooo89
nie bardzo czaje. napisałeś tak co te pola trzymaja ze nie wiem o co chodzi...

nie mozna po prostu:

id | text
1 | jakis text
2 | jakis text 2
?

a co do problemu to strzelam bo nie wiem do końca o co chodzi: chcesz obliczyć jakim procentem całości jest var1 = 1? to tu się matematyka kłania taka jeszcze z podstawówki.
neverever
już wyjaśniam:

mam tabelę o takiej postaci:

TYP | PODTYP | VAR1 | VAR2 | VAR3
-------------------------------------------
99 | 34 | 1 | 2 | 1
10 | 13 | 1 | 2 | 1
99 | 34 | 1 | 1 | 1
99 | 34 | 2 | 2 | 1
26 | 15 | 2 | 2 | 1
99 | 34 | 1 | 2 | 2
99 | 34 | 1 | 2 | 1
...


teraz chcę sobie wybrać np. TYP=99 i PODTYP=34 - w bazie jest jakaś grupa rekordów spełniających ten warunek
-powiedzmy 450rekordów.

Teraz chcę by mi zwróciło procentowo jaka część tej grupy w VAR1 ma status =1, podobnie dla VAR2 i VAR3
Ja wiem że % to prosta matematyka i wiem jak się je liczy -tylko mam kłopot ze stworzeniem jednego sensownego zapytania które by to realizowało. W dużym uproszczeniu taki
SELECT ile, p1, p2, p3 FROM tabela WHERE Typ=99 AND PODTYP=34
-gdzie: ile=liczba zwróconych rekordów, p1=(ileVAR1=1/ile)*100, p2=(ileVAR2=1/ile)*100, p3=(ileVAR3=1/ile)*100

Jaśniej już chyba nie umiem tego wyłożyć.

Tylko jak to w jednym zapytaniu upchnąć?
erix
  1. SET @ile = (SELECT count(typ) FROM tabela WHERE typ=99 AND podtyp=34);
  2. SELECT (count(p1)/@ile), (count(p2)/@ile), (count(p3)/@ile) FROM tabela WHERE Typ=99 AND PODTYP=34

Pisane z palca. Nie jest to w jednym zapytaniu, ale wydajniej niż robić podzapytanie do każdej kolumny.

Jeszcze to sprawdzę.

edit: możesz jeszcze coś z tym kombinować:
  1. SET @ile = (SELECT count(typ) FROM tabela WHERE typ=99 AND podtyp=34);
  2. SELECT (sum(p1)/@ile), (sum(p2)/@ile), (sum(p3)/@ile) FROM tabela WHERE Typ=99 AND PODTYP=34


Jeśli koniecznie chcesz w jednym, to zmień @ile na count(kolumna). Ale to wyliczy tylko 0/1.
piotrooo89
nie wiem czy dobrze myśle ale do obliczenia wartości procentowej jednego pola nie trzeba zrobić tak:

  1. SELECT ((sum(p1)*100)/@ile)
neverever
mmmmm... bliżej, ale jeszcze chyba nie to.

tych p1, p2 i p3 to ja faktycznie nie mam, to tylko przykład co chciał bym uzyskać.
to p1 w zamierzeniu stanowić by miało:
SELECT COUNT(*) FROM tabela WHERE TYP=99 AND PODTYP=34 AND VAR1=1
dzielone na
SELECT COUNT(*) FROM tabela WHERE TYP=99 AND PODTYP=34
to wszystko *100 i na koniec zaokrąglone.

-analogicznie p2 i p3

Wracając jeszcze do wyjaśnienia.
Mam w bazie przykładowo dajmy 6710 rekordów, z czego 450 spełnia warunek WHERE TYP=99 AND PODTYP=34
Teraz na te 450, jest 20 rekordów gdzie VAR1=1, 225 z VAR2=1 i 110 z VAR3=1

zatem obliczając tu % - wzór: (ile/zilu)*100 powinienem dostać tutaj po zaokrągleniu dla VAR1 4%, dla VAR2 50% i dla VAR3 24%

Nie jest to więc takie proste jak by się wydawało, przynajmniej dla mnie. sciana.gif

Na upartego to mogę to w oddzielnych zapytaniach powyciągac i % już w php obliczyć dry.gif
No ale może ktoś podsunie jeszcze jakieś rozsądne rozwiązanie.
erix
  1. SELECT (count(p1)/(SELECT count(id) FROM tabela WHERE var1=1)), (count(p2)/(SELECT count(id) FROM tabela WHERE var2=1)), (count(p3)/(SELECT count(id) FROM tabela WHERE var3=1)) FROM tabela WHERE Typ=99 AND PODTYP=34

dostosuj sobie
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.