Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PostgreSQL _ [PostgreSQL] przebudowa zapytania

Napisany przez: SaMi 1.12.2014, 15:34:19

Witam,
Mam listę produktów i muszę pobrać dane tych produktów a te z kolei rozrzucone są po różnych tabelach.

Tabele:

projekty:
- id_projekt,
- prefix,
- nazwa,
- puzytkowa,
- kubatura,
...

technologie:
- id_parametry,
- id_projekt,
....

kosztorysy:
- id_parametry,
- id_el_kosztorysowy,
- kwota,
- kwota_syst_gosp,
- kwota_materialy,
...

Tabela technologie zawiera nazwy technologii dla wszystkich projektów zawartych w tabeli projekty
natomiast tabela kosztorysy zawiera koszty tylko dla niektórych projektów.

Wszystko działa jeśli dla wybranych projektów są kosztorysy, jeśli ich nie ma warunek nie jest spełniony i zwraca pusty wynik.
Jak przebudować zapytanie by zwracało informacje o projektach a w przypadku gdy nie ma kosztorysu to pola kwota, kwota_syst_gosp i kwota_materialy mialy wartosc 0.

  1. SELECT p.nazwa,p.prefix,p.puzytkowa, p.kubatura, SUM(ko.kwota), SUM(ko.kwota_syst_gosp), SUM(ko.kwota_materialy)
  2. FROM projekty AS p
  3. INNER JOIN technologie AS te USING(id_projekt)
  4. INNER JOIN kosztorysy AS ko ON ko.id_technologia ko.id_technologia = te.id_parametry
  5. WHERE hide=0 AND mtmstyl=1 AND prefix IN('proj_1','proj_2') AND ko.id_el_kosztorysowy IN(1,1000)
  6. GROUP BY p.nazwa,p.prefix,p.puzytkowa, p.kubatura
  7. ORDER BY nazwa DESC

Napisany przez: mmmmmmm 1.12.2014, 20:11:40

INNER JOINY zamienić na LEFT JOINY a SUM(...) na Coalesce(SUM(...),0)

Napisany przez: SaMi 2.12.2014, 11:23:42

Dziękuję za naprowadzenie, wszystko śmiga jak należy.

  1. SELECT
  2. p.nazwa,p.prefix,p.puzytkowa, p.kubatura,
  3. Coalesce(SUM(ko.kwota),0) AS cena_sys_zleconym,
  4. Coalesce(SUM(ko.kwota_syst_gosp),0) AS cena_sys_gospodarczym,
  5. Coalesce(SUM(ko.kwota_materialy),0) AS koszt_materialow
  6. FROM projekty AS p
  7. INNER JOIN technologie AS te USING(id_projekt)
  8. LEFT JOIN kosztorysy AS ko ON ko.id_technologia ko.id_technologia = te.id_parametry AND ko.id_el_kosztorysowy IN(1,1000)
  9. WHERE hide=0 AND mtmstyl=1 AND prefix IN('proj_1','proj_2')
  10. GROUP BY p.nazwa,p.prefix,p.puzytkowa, p.kubatura
  11. ORDER BY nazwa DESC


Zastanawiam się jeszcze czy w GROUP BY powinno znajdować się aż tyle elementów. W przykładzie mam tylko 4 ale w rzeczywistym zapytaniu jest ich więcej.

Napisany przez: pasman 30.03.2015, 14:03:36

Cytat(SaMi @ 2.12.2014, 11:23:42 ) *
Zastanawiam się jeszcze czy w GROUP BY powinno znajdować się aż tyle elementów. W przykładzie mam tylko 4 ale w rzeczywistym zapytaniu jest ich więcej.



tak.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)