Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Sumowanie wyniku kilku zapytań
Forum PHP.pl > Forum > Przedszkole
rufuspl
Cześć.
Mam taki problem, że łącząc/sumując trzy zapytania używając UNION w wyniku otrzymuję wynik niepołączony - powtarzają się kody procedur.

Oto moje zapytanie:
  1. $zapytanie_icd9="SELECT `procedura1`, count(`procedura1`) as liczba FROM `opis`
  2. left join `pacjent` using (id_pac)
  3. where `opis`.`procedura1`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  4. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do'
  5. GROUP BY `procedura1`
  6. UNION
  7. SELECT `procedura2`, count(`procedura2`) as liczba FROM `opis`
  8. left join `pacjent` using (id_pac)
  9. where `opis`.`procedura2`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  10. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do'
  11. GROUP BY `procedura2`
  12. UNION
  13. SELECT `procedura3`, count(`procedura3`) as liczba FROM `opis`
  14. left join `pacjent` using (id_pac)
  15. where `opis`.`procedura3`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  16. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do'
  17. GROUP BY `procedura3`
  18. ";


Jak połączyć wyniki tych zapytań tak, aby wyświetlały się unikatowe kody procedur?
nospor
To zapytanie co teraz masz to wrzuc jako podzapytanie i zrob group by na caly wyniku jeszczce raz.

Swoja droga masz zwalona strukture bazy ze musisz takie cuda na kiju robic
rufuspl
Chyba już tak próbowałem i nie zadziałało. Próbowałem też nadać etykietę `procedura` polu `procedura1` 2 i 3 i też dziwnie się to zachowało.
Spróbuję jeszcze raz i wkleję efekty.
Jeśli chodzi o strukturę bazy, to masz na myśli to, że każda procedura powinna być osobnym rekordem?
Jeśli tak, to właśnie tak chcę teraz przerobić bazę, bo oczywiście założenia tworzonej aplikacji były zgoła inne od obecnych oczekiwań, gdy aplikacja zaczęła już chodzić facepalmxd.gif
nospor
Cytat
Jeśli chodzi o strukturę bazy, to masz na myśli to, że każda procedura powinna być osobnym rekordem?

Tak

Cytat
bo oczywiście założenia tworzonej aplikacji były zgoła inne od obecnych oczekiwań, gdy aplikacja zaczęła już chodzić
Tak zawsze jest. Jeszcze nie mialem projektu gdzie sie nagle cos w srodku roboty odmienilo. Czasami trzeba pewne sytuacje przewidywac wink.gif
rufuspl
Cytat
Tak zawsze jest. Jeszcze nie mialem projektu gdzie sie nagle cos w srodku roboty odmienilo. Czasami trzeba pewne sytuacje przewidywac wink.gif


Taką wiedzę zdobywa się niestety z czasem wink.gif
nospor
To prawda. Na dodatek w bolach... pamietam moj pierwszy taki projekt jakby to bylo wczoraj biggrin.gif oj, jakby ktos teraz na niego spojrzal na strukture bazy to by sie chyba zalamal. A wszystko przez zle zalozenia poczatkowe, ktorych potem nie szlo normalnie poprawic. Eh... stare dobre czasy wink.gif
rufuspl
  1. $zapytanie_icd9="SELECT * FROM (
  2. SELECT `procedura1` AS `procedura`, count(`procedura1`) AS liczba FROM `opis`
  3. left join `pacjent` using (id_pac)
  4. where `opis`.`procedura1`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  5. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do'
  6. UNION
  7. SELECT `procedura2` AS `procedura`, count(`procedura2`) AS liczba FROM `opis`
  8. left join `pacjent` using (id_pac)
  9. where `opis`.`procedura2`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  10. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do'
  11. UNION
  12. SELECT `procedura3` AS `procedura`, count(`procedura3`) AS liczba FROM `opis`
  13. left join `pacjent` using (id_pac)
  14. where `opis`.`procedura3`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  15. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do') GROUP BY `procedura`
  16. ";


Powyższe zapytanie daje pusty wynik

  1. $zapytanie_icd9="SELECT * FROM (
  2. (SELECT `procedura1` AS `procedura`, count(`procedura1`) AS liczba FROM `opis`
  3. left join `pacjent` using (id_pac)
  4. where `opis`.`procedura1`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  5. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do')
  6. UNION
  7. (SELECT `procedura2` AS `procedura`, count(`procedura2`) AS liczba FROM `opis`
  8. left join `pacjent` using (id_pac)
  9. where `opis`.`procedura2`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  10. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do')
  11. UNION
  12. (SELECT `procedura3` AS `procedura`, count(`procedura3`) AS liczba FROM `opis`
  13. left join `pacjent` using (id_pac)
  14. where `opis`.`procedura3`!='' AND `pacjent`.`id_ksiegi`=3 AND `pacjent`.`w_status`=1 AND `pacjent`.`czy_usuniety`=0
  15. AND `pacjent`.`data_zab`>='$stat1_data_od' AND `pacjent`.`data_zab`<='$stat1_data_do')) GROUP BY `procedura`
  16. ";


Dodanie nawiasów (jak powyżej) nic nie zmienia - pusty wynik.
Coś źle robię?
nospor
pusty wynik tylko gdy masz blad. WYswietl sobei blad zapytania
trueblue
Możesz uprościć trochę to zapytanie:

  1. SELECT COUNT(procedura), procedura FROM (
  2. SELECT id_pac,procedura1 AS procedura FROM opis
  3. UNION ALL
  4. SELECT id_pac,procedura2 AS procedura FROM opis
  5. UNION ALL
  6. SELECT id_pac,procedura3 AS procedura FROM opis
  7. ) AS procedury
  8. JOIN pacjent AS p ON p.id_pac=procedury.id_pac
  9. WHERE procedury.procedura<>'' AND p.id_ksiegi=3 AND p.w_status=1 AND p.czy_usuniety=0
  10. AND p.data_zab>='$stat1_data_od' AND p.data_zab<='$stat1_data_do'
  11. GROUP BY procedury.procedura

Pierwszy warunek w WHERE możesz też przenieść do każdego podzapytania w UNION.
rufuspl
Cytat(trueblue @ 4.10.2017, 14:35:43 ) *
Możesz uprościć trochę to zapytanie:


Skorzystałem z Twojej podpowiedzi, ale musiałem dodać etykietę dla COUNT(procedura) - jak niżej

  1. $zapytanie_icd9="SELECT COUNT(procedura) as liczba, procedura FROM (
  2. SELECT id_pac,procedura1 AS procedura FROM opis
  3. UNION ALL
  4. SELECT id_pac,procedura2 AS procedura FROM opis
  5. UNION ALL
  6. SELECT id_pac,procedura3 AS procedura FROM opis
  7. ) AS procedury
  8. JOIN pacjent AS p ON p.id_pac=procedury.id_pac
  9. WHERE procedury.procedura<>'' AND p.id_ksiegi=3 AND p.w_status=1 AND p.czy_usuniety=0
  10. AND p.data_zab>='$stat1_data_od' AND p.data_zab<='$stat1_data_do'
  11. GROUP BY procedury.procedura";


Wygląda na to, że otrzymany wynik jest tym czego oczekiwałem smile.gif Dzięki!
A czy dodanie warunku do podzapytań jest konieczne?
trueblue
Jeśli tak zrobisz to odrzucisz niepotrzebne rekordy już na poziomie UNION, ale musiałbyś sprawdzić czas i plan wykonania.
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.