Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL] Sumowanie wyniku kilku zapytań, użycie UNION
rufuspl
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 17.06.2017

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


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?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rufuspl
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 17.06.2017

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


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
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rufuspl
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 17.06.2017

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


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
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rufuspl
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 17.06.2017

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


  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ę?
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




pusty wynik tylko gdy masz blad. WYswietl sobei blad zapytania


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post
Post #9





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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.


--------------------
Go to the top of the page
+Quote Post
rufuspl
post
Post #10





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 17.06.2017

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


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?
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Jeśli tak zrobisz to odrzucisz niepotrzebne rekordy już na poziomie UNION, ale musiałbyś sprawdzić czas i plan wykonania.


--------------------
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 Aktualny czas: 22.08.2025 - 01:46