Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Problem z prawidłowym zapytaniem
Forum PHP.pl > Forum > Przedszkole
dopal
Witam,

Dla opisania problemu urzyję jednego przykładu, generalnie zapytanie tyczy się całej tabeli oddania,a nie jednego przykładu.

w polu ODDNI2 są wartości liczbowe 100,150...600, 650. W polu ODSRDK znajdują się różne skrótowe nazwy, które są przypisane do określonych wartości z pola ODDNI2 np: ODDNI2=450 to ODSRDK=EK lub KP itd.

Chcę stworzyć zapytanie, które wybierze mi z tabeli ODDANIA, takie pozycje, których suma pól ODDNI2 będzie większa od 20000.
  1. "SELECT ODPLNR, ODDWNR, SUM(ODDNI2) AS NUMER, DADWIH FROM ODDANIA INNER JOIN DAWCY ON DADWNR=ODDWNR AND DAPLNR=ODPLNR
  2. //wHERE ODPLNR ='14000' AND ODDWNR ='40876'
  3. //GROUP BY ODPLNR,ODDWNR,DADWIH HAVING SUM(ODDNI2) > '20000' ";


To zapytanie działa mi ok i otrzymuję dobre wyniki, ale SUM(ODDNI2) AS NUMER, powinna być sumą z takich oto zapytań:
  1. $query2 = "SELECT ODPLNR, ODDWNR, SUM(ODDNI2 * 2) AS NUMER_KP FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EK' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='KP' GROUP BY ODPLNR,ODDWNR";
  2.  
  3. $query3 = "SELECT ODPLNR, ODDWNR, SUM(ODDNI2 / 3) AS NUMER_OS FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='FA' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EP' GROUP BY ODPLNR,ODDWNR";
  4.  

i dopiero ta suma powinna być większa od 20000.
Ja zrobić te podzapytania w zapytaniu?
Jednocześnie chciałbym by w wystwietlanej tabeli mieć zarówno pozycję NUMER z 1 zapytania, jak i NUMER_KP i NUMER_OS czyli np.

ODPLNR ODDWNR NUMER NUMER_KP NUMER_OS
14000 40876 5000 3250 1750
lampi
Zapodaj jeszcze error z mysql'a
dopal
Zapytanie miało by mniej więcej tak wyglądać ( oczywiście ta forma nie działa )

  1.  
  2. SELECT ODPLNR, ODDWNR, SUM(ODDNI2) AS NUMER,
  3. SUM(SELECT ODPLNR, ODDWNR, SUM(ODDNI2) FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EK' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='KP' GROUP BY ODPLNR,ODDWNR) AS NUMER_KP,
  4.  
  5. SUM(SELECT ODPLNR, ODDWNR, SUM(ODDNI2 / 3) FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='FA' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EP' GROUP BY ODPLNR,ODDWNR) AS NUMER_OS,
  6.  
  7. DADWIH
  8. FROM ODDANIA INNER JOIN DAWCY ON DADWNR=ODDWNR AND DAPLNR=ODPLNR
  9. WHERE ODPLNR ='14000' AND ODDWNR ='40876'
  10. GROUP BY ODPLNR,ODDWNR,DADWIH HAVING SUM(NUMER_OS+NUMER_KP) > '3000'


a błąd jest taki:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0104 - Niepoprawny leksem ODPLNR. Poprawne leksemy: ) ,., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest_magpoj.php on line 132


Dla jednego rekordu zrobiłem takie zapytanie które działa:
  1. SELECT ODPLNR, ODDWNR, SUM(ODDNI2) AS NUMER,
  2. (SELECT SUM(ODDNI2) FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EK' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='KP' ) AS NUMER_KP,
  3.  
  4. (SELECT SUM(ODDNI2 / 3) FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='FA' OR ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK='EP' ) AS NUMER_OS,
  5.  
  6. DADWIH
  7. FROM ODDANIA INNER JOIN DAWCY ON DADWNR=ODDWNR AND DAPLNR=ODPLNR
  8. WHERE ODPLNR ='14000' AND ODDWNR ='40876'
  9. GROUP BY ODPLNR,ODDWNR,DADWIH

Wynik wyświetlenia jest prawidłowy. A jak to zrobić dla całej tabeli, by było grupowanie wszystkich rekordów po polach ODPLNR, ODDWNR i wybierał sumę np.
(NUMER_OS+NUMER_KP) > '3000' to ciągle nie wiem.
mmmmmmm
Coś w ten deseń:
  1. SELECT ODPLNR, ODDWNR, SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) AS NUMER_KP, SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) AS NUMER_OS FROM ODDANIA WHERE ODPLNR ='14000' AND ODDWNR ='40876' AND ODSRDK IN ('EK','KP', 'FA', 'EP') GROUP BY ODPLNR,ODDWNR

dalej sam kombinuj.
dopal
Kombinuje smile.gif
ale nie do końca wychodzi

  1. SELECT ODPLNR, ODDWNR, SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) AS NUMER_KP, SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) AS NUMER_OS FROM ODDANIA WHERE ODPLNR >'14000' AND ODDWNR >'40876' AND ODSRDK IN ('EK','KP', 'FA', 'EP') GROUP BY ODPLNR,ODDWNR HAVING SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) >'2000'

Tak mi działa, ale w HAVING powinien być taki warunek:
SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) + SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) >'2000'

Przy zrobieniu takiego zapisu nie otrzymuję żadnego wyniku.

Drugi problem, z którym sobie nie radzę to suma SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) + SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) AS NUMER
  1. SELECT ODPLNR, ODDWNR, SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) AS NUMER_KP,
  2. SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) AS NUMER_OS ,
  3. SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2) + SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3) AS NUMER
  4. FROM ODDANIA WHERE ODPLNR >'14000' AND ODDWNR >'40876' AND ODSRDK IN ('EK','KP', 'FA', 'EP') GROUP BY ODPLNR,ODDWNR
  5.  


Oto fragment wyników:
lp. odplnr oddwnr numer_kp numer_os numer
_______________________________________________
13165 | 14002 | 3959 | 1800 | 0 | 0
13166 | 14002 | 3960 | - | 7650 | 0
13167 | 14002 | 3961 | - | 450 | 0
13168 | 14002 | 3962 | 6750 | 200 | 6950
13169 | 14002 | 3963 | 4950 | 416.67 | 5366.67
13170 | 14002 | 3964 | 7650 | 433.33 | 8083.33
13171 | 14002 | 3965 | 10800 | 1950 | 0
13172 | 14002 | 3966 | 1800 | 216.67 | 2016.67
13173 | 14002 | 3967 | 1350 | 0 | 0
13174 | 14002 | 3968 | 17100 | 9450 | 0
13175 | 14002 | 3969 | 2250 | 0 | 0

Generalnie jeśli w numer_kp i numer_os jest jakiś wynik, to pozycja numer zostaje wyliczona ( choć w lp.13174 widać, że nie zawsze ).
Jeśli jest numer_os, a nie ma numer_kp, to numer nie zostaje wyliczony,
a jeśli numer_kp jest uzupełniony, a w numer_os wynik wynosi 0, to numer nie zostaje wyliczony.
Zamiast - w wyświetlanej tabeli jest tylko puste miejsce.

Przy "pomocy" PHP udaje mi się to zrobić jak trzeba, ale chciałbym to wszystko zamieścić w 1 sql i z tym zapytaniem mam problemy.
mmmmmmm
  1. SELECT ODPLNR, ODDWNR, Coalesce(SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2), 0) AS NUMER_KP,
  2. Coalesce(SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3), 0) AS NUMER_OS ,
  3. Coalesce(SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2), 0) + Coalesce(SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3), 0) AS NUMER
  4.  
  5. FROM ODDANIA WHERE ODPLNR >'14000' AND ODDWNR >'40876' AND ODSRDK IN ('EK','KP', 'FA', 'EP') GROUP BY ODPLNR,ODDWNR HAVING (Coalesce(SUM(CASE WHEN ODSRDK IN ('EK', 'KP') THEN ODDNI2 END * 2), 0) + Coalesce(SUM(CASE WHEN ODSRDK IN ('EP', 'FA') THEN ODDNI2 END / 3), 0))>2000
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.