Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Suma dwóch sum
markonix
post 8.01.2012, 14:08:21
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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.

Ten post edytował markonix 8.01.2012, 17:47:28


--------------------
Go to the top of the page
+Quote Post
skowron-line
post 8.01.2012, 15:27:34
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


  1. SELECT sum(`column`)
  2. FROM TABLE
  3. wehre (`l` = 2 OR `l` = 3)


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
markonix
post 8.01.2012, 17:47:19
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Mała literówka ale nieważne.

Mówiłem o sumie dwóch sum, gdzie te dwie sumy to są różne kolumny.


--------------------
Go to the top of the page
+Quote Post
mortus
post 8.01.2012, 18:14:00
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
vokiel
post 8.01.2012, 19:16:29
Post #5





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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


--------------------
Go to the top of the page
+Quote Post
mortus
post 8.01.2012, 19:22:18
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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`


Ten post edytował mortus 8.01.2012, 19:33:13
Go to the top of the page
+Quote Post
vokiel
post 8.01.2012, 19:33:22
Post #7





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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.


--------------------
Go to the top of the page
+Quote Post
mortus
post 8.01.2012, 19:42:16
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
markonix
post 8.01.2012, 20:28:47
Post #9





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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

Ten post edytował markonix 8.01.2012, 20:30:38


--------------------
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 Wersja Lo-Fi Aktualny czas: 18.07.2025 - 08:49