Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL]Problem z prawidłowym zapytaniem
dopal
post 30.08.2013, 10:51:18
Post #1





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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
Go to the top of the page
+Quote Post
lampi
post 30.08.2013, 10:56:13
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 30.08.2013
Skąd: Częstochowa

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


Zapodaj jeszcze error z mysql'a


--------------------
Sklep z lampami - http://www.krislamp.pl
Go to the top of the page
+Quote Post
dopal
post 30.08.2013, 11:07:56
Post #3





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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.

Ten post edytował dopal 30.08.2013, 12:02:03
Go to the top of the page
+Quote Post
mmmmmmm
post 30.08.2013, 15:00:07
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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.
Go to the top of the page
+Quote Post
dopal
post 30.08.2013, 22:37:01
Post #5





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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.
Go to the top of the page
+Quote Post
mmmmmmm
post 31.08.2013, 14:40:43
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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
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 Wersja Lo-Fi Aktualny czas: 20.07.2025 - 01:49