Michał Wójcik

Michał Wójcik Front End Developer
- Freelancer

Temat: Jedno zapytanie sumujace 2 różne wartosci

Hej,
mam następujaca baze danych:
cena; status
100;1
200;1
122;2
333;1
321;2
112;2
itd.

Chciałbym zrobic zapytanie, które zwróci mi 2 wartości.
1. Suma wszystkich wierszy z statusem 1
2. Suma wszystkich wierszy z statusem 2
--- Zależy mi, aby bo bylo jedno zapytanie.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Jedno zapytanie sumujace 2 różne wartosci

Zakładając, że nazwa tabeli to "status_info":


SELECT SUM(status_info.cena) as sum1, SUM(status_info2.cena) as sum2 FROM status_info LEFT JOIN status_info as status_info2 ON status_info2.status = 2 WHERE status_info.status = 1


tylko uprzedzam - nie rób tak, o wiele lepiej zrobić to dwoma osobnymi zapytaniami, jeżeli musisz w jednym zapytaniu, to znaczy, że program ma złą architekturę.Ten post został edytowany przez Autora dnia 14.06.14 o godzinie 16:45
Michał Wójcik

Michał Wójcik Front End Developer
- Freelancer

Temat: Jedno zapytanie sumujace 2 różne wartosci

hej,
ja to wlasnie chce zrobic w jedym zapytaniu poniewaz tak podobno jest optymalniej.. Więc teraz mnie troche z tropu mnie wybiłes..
Tomasz Zadora

Tomasz Zadora programuję

Temat: Jedno zapytanie sumujace 2 różne wartosci

Być może z punktu widzenia bazy danych to jest trochę lepiej bo zamiast dwóch zapytań masz jedno, ale korzyść prawdopodobnie jest niewielka.

Tutaj trzeba by zobaczyć np. przez EXPLAIN co jest szybsze.

Za to pomyśl, gdybyś musiał zrobić sumę np. dla 50-ciu różnych statusów: zapytanie SQL byłoby monstrualne, tak samo jak kłopotliwe konstruowanie go i analiza odpowiedzi.
Sławomir Broda

Sławomir Broda VBA, Excel, Access,
SAP i wszystko
związane z
automatyzac...

Temat: Jedno zapytanie sumujace 2 różne wartosci

Tomasz Z.:
Zakładając, że nazwa tabeli to "status_info":


SELECT SUM(status_info.cena) as sum1, SUM(status_info2.cena) as sum2 FROM status_info LEFT JOIN status_info as status_info2 ON status_info2.status = 2 WHERE status_info.status = 1


tylko uprzedzam - nie rób tak, o wiele lepiej zrobić to dwoma osobnymi zapytaniami, jeżeli musisz w jednym zapytaniu, to znaczy, że program ma złą architekturę.
Ale, że jak ?

SELECT Tabela2.status, Sum(Tabela2.cena) AS SumaOfcena
FROM Tabela2
GROUP BY Tabela2.status;
Tomasz Zadora

Tomasz Zadora programuję

Temat: Jedno zapytanie sumujace 2 różne wartosci

Jemu chodzi o konkretne dwa statusy, a nie wszystkie. Zapytanie przez GROUP BY jest w tym momencie o wiele mniej wydajne.

Edit: ok w sumie masz rację, lepiej to zrobić przez group by dodając ewentualnie warunki które statusy mają być brane pod uwagę. Przy left join dla każdego wiersza musi nastąpić przyłączenie - odpowiedziałem na szybko bez zastanowienia :)

Edit 2: zrobiłem jeszcze test na dość dużej bazie i zdecydowanie dwa osobne zapytania są szybsze niż jedno z group by - jest indeks na kolumnę class_id.

łącznie dwa zapytania trwają ok 0.008 sek:


SELECT SQL_NO_CACHE product.class_id, sum(product.brutto_price) as sum1 FROM `product` WHERE product.class_id = 1
SELECT SQL_NO_CACHE product.class_id, sum(product.brutto_price) as sum1 FROM `product` WHERE product.class_id = 2


Zapytanie z group by wykonuje się ok. 0.014 sek

SELECT product.class_id, sum(product.brutto_price) as sum1 FROM `product` WHERE product.class_id = 1 OR product.class_id = 2 GROUP BY product.class_id
Ten post został edytowany przez Autora dnia 14.06.14 o godzinie 21:17
Michał Wójcik

Michał Wójcik Front End Developer
- Freelancer

Temat: Jedno zapytanie sumujace 2 różne wartosci

Witam,
dzieki wielkie. To robie w 2 zapytaniach w takim razie. W bazie mam 20000 rekordow około (+okolo 50 dziennie).

Naprawde Panowie dziękuje za pomoc ;)
Tomasz Zadora

Tomasz Zadora programuję

Temat: Jedno zapytanie sumujace 2 różne wartosci

Spoko, pamiętaj, że zawsze możesz sprawdzić wydajność zapytania w MySQL przez włączenie EXPLAIN na początku SQL.

Następna dyskusja:

Zapytanie laczace wyniki w ...




Wyślij zaproszenie do