Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Suma dwóch sum
Forum PHP.pl > Forum > Bazy danych > MySQL
markonix
Czy można w jednym zapytaniu dokonać sumowania dwóch sum (każda suma ma inny warunek WHERE).

  1. SELECT SUM( `column1` ) AS `s1`
  2. FROM `table`
  3. WHERE `1` = '2'
  4.  
  5. SELECT SUM( `column2` ) AS `s2`
  6. FROM `table`
  7. WHERE `1` = '3'


Czy sobie darować i sumę wykonać już w PHP.
skowron-line
  1. SELECT sum(`column`)
  2. FROM TABLE
  3. wehre (`l` = 2 OR `l` = 3)
markonix
Mała literówka ale nieważne.

Mówiłem o sumie dwóch sum, gdzie te dwie sumy to są różne kolumny.
mortus
Można użyć np. sumy tabel/zbiorów UNION:
  1. SELECT SUM(`suma`) FROM (
  2. SELECT SUM(`column1`) `suma` FROM `table` WHERE `l` = 2
  3. UNION
  4. SELECT SUM(`column2`) `suma` FROM `table` WHERE `l` = 3
  5. ) `sumy`

W sumie to nie wiem, czy można jakoś inaczej. Choć może jakieś zapytanie z instrukcją warunkową (IF) zdałoby egzamin.
vokiel
Można też zrobić JOIN'a:
  1. SELECT (SUM(`t1`.`column1`)+SUM(`t2`.`column2`)) AS 'suma_final'
  2. FROM `table` AS `t1`
  3. LEFT JOIN `table` AS `t2` ON `t1`.`id` = `t2`.`id`
  4. WHERE `t1`.`1` = 2
  5. OR `t2`.`1` = 3
mortus
Cytat(vokiel @ 8.01.2012, 19:16:29 ) *
Można też zrobić JOIN'a:
  1. SELECT (SUM(`t1`.`column1`)+SUM(`t2`.`column2`)) AS 'suma_final'
  2. FROM `table` AS `t1`
  3. LEFT JOIN `table` AS `t2` ON `t1`.`id` = `t2`.`id`
  4. WHERE `t1`.`1` = 2
  5. OR `t2`.`1` = 3

Też tak na początku myślałem. Jednak nie można, bo to zupełnie inny wynik daje. De facto jest to chyba kwestia grupowania wyników, którego przy zapytaniu z JOIN-em nie da się użyć prawidłowo.

Można jeszcze użyć podzapytań:
  1. SELECT (
  2. (SELECT SUM(`t1`.`column1`) FROM `table` `t1` WHERE `l` = 2)
  3. +
  4. (SELECT SUM(`t2`.`column2`) FROM `table` `t2` WHERE `l` = 3)
  5. ) AS `suma_sum`
vokiel
Przyznam, że wszystkich kombinacji nie sprawdzałem, ale na bazie testowej (z danymi niepasującymi do zsumowania) zadziałało poprawnie.

Najlepiej jak autor wątku sam sprawdzi wszystkie rozwiązania, porówna ich poprawność, szybkość (fajnie jakby pokazał wyniki porównawcze dla rzeczywistych danych) i wybierze te, które będzie mu najbardziej odpowiadało.
mortus
Cytat(vokiel @ 8.01.2012, 19:33:22 ) *
Przyznam, że wszystkich kombinacji nie sprawdzałem, ale na bazie testowej (z danymi niepasującymi do zsumowania) zadziałało poprawnie.

Najlepiej jak autor wątku sam sprawdzi wszystkie rozwiązania, porówna ich poprawność, szybkość (fajnie jakby pokazał wyniki porównawcze dla rzeczywistych danych) i wybierze te, które będzie mu najbardziej odpowiadało.

Nie wierzę w to. Zresztą widać "gołym okiem", że zapytanie sumuje wartości z kolumny column1 dla l = 2 i l = 3, czyli nie doda wartości np. dla l = 1. Podobnie jest z kolumną column2 gdzie zostaną zsumowane wartości dla l = 2 i l = 3. Przecież warunek po OR nie oddziela Ci w żaden sposób jednej tabeli (reprezentowanej przez alias) od drugiej (reprezentowanej przez alias), a złączenie tylko podwaja liczbę kolumn, nadając im odpowiednie nazwy. Też testowałem zapytania.
markonix
Pojedynczy SELECT na sumę:
Wykonanie zapytania trwało 0.0045 sekund(y)
(Czyli 2 zapytania około 0.0100 sekundy + dodawanie w PHP).

Cytat(mortus @ 8.01.2012, 19:22:18 ) *
Można jeszcze użyć podzapytań:
  1. SELECT (
  2. (SELECT SUM(`t1`.`column1`) FROM `table` `t1` WHERE `l` = 2)
  3. +
  4. (SELECT SUM(`t2`.`column2`) FROM `table` `t2` WHERE `l` = 3)
  5. ) AS `suma_sum`

Wykonanie zapytania trwało 0.0162 sekund(y))
Tak więc pozapytanie zabiera ponad 300% jednego selecta.

Sposób z UNION:
Wykonanie zapytania trwało 0.0088 sekund(y))
Zabiera tyle samo co oba zapytania, ale pomija PHP no i jest w jednym zapytaniu.
Wybieram smile.gif
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.