Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytania SQL...
Forum PHP.pl > Forum > Bazy danych > Oracle
funfel
Witam,
Nie bardzo mogę sobie poradzić z kilkoma zapytaniami SQL, m.in.:

1. Wypisz jakie usługi dla kontraktów 2,3 i 4 były aktywne w 2001-07-02.
2. Dla każdego kontraktu w bazie, wypisz aktualny status usługi nr 10 i nr
20.

Zalecana postać:

ID_KONTRAKTU USL_10 USL_20
1 "Aktywna" "Aktywna"
2 "Aktywna" "Deaktywna"
3 "Deaktywna" "Deaktywna"

3. Wypisz wszystkie usługi, dla kontraktu, mającego aktualnie najwięcej
włączonych usług.

Gdyby ktoś mial jakieś pomysły, to proszę o pomoc smile.gif Z gry dzięki smile.gif

Zapytania dotyczą tabeli Uslugi
Dodam że atrybut data_zm określa datę zmiany stanu usługi z aktywnej na
nieaktywna i odwrotnie.

Pozdrawiam, Bartek

A oto kod generujący tabele:

  1. CREATE TABLE USLUGI
  2. (
  3. KONTRAKT_ID NUMBER(10),
  4. USLUGA_ID NUMBER(4),
  5. SEQNO NUMBER(4),
  6. DATA_ZM DATE,
  7. STATUS VARCHAR(1)
  8. );
  9.  
  10. TRUNCATE TABLE uslugi;
  11.  
  12. declare j number;
  13. k number;
  14. u number;
  15. sq number;
  16. d1 number;
  17. dt date;
  18. dt2 date;
  19. st number;
  20. us_n number;
  21.  
  22. BEGIN dt := TO_DATE ('2000-01-01', 'YYYY-MM-DD');
  23. FOR j IN 1 .. 10000
  24. LOOP
  25. u:=1;
  26. d1 := TRUNC (DBMS_RANDOM.VALUE (1, 1300));
  27. sq := TRUNC (DBMS_RANDOM.VALUE (1, 4));
  28. dt2 := dt + d1;
  29. k :=0;
  30. us_n := TRUNC (DBMS_RANDOM.VALUE (1, 20));
  31. FOR i IN 1 .. us_n
  32. LOOP
  33. k := TRUNC (DBMS_RANDOM.VALUE (1, 10));
  34. --sys.dbms_output.put_line(to_char(dt2,'YYYY-MM-DD'));
  35. INSERT INTO uslugi VALUES (j, u , 0, dt2, 'a');
  36. IF sq>1 then
  37. INSERT INTO uslugi VALUES (j, u , 1, dt2+k, 'd');
  38. IF sq>2 then
  39. INSERT INTO uslugi VALUES (j, u , 2, dt2+2*k, 'a');
  40. end IF;
  41. end IF;
  42. u:=u+k;
  43. END LOOP;
  44. END LOOP;
  45. COMMIT;
  46. END;
  47. /
KILIUSZKIN
Tak na szybko (bez sprawdzania)
Ad1.)
  1. SELECT DISTINCT (u.kontrakt_id, u.usluga_id) FROM uslugi u WHERE u.kontrakt_id BETWEEN 2 AND 4 AND u.STATUS='a' AND u.data_zm <= trunc(TO_DATE ('2001-07-02', 'YYYY-MM-DD')) AND (NOT EXISTS
  2. (SELECT 1 FROM uslugi uu WHERE uu.kontrakt_id=u.kontrakt_id AND uu.usluga_id=u.usluga_id AND uu.STATUS='d' AND uu.data_zm > u.data_zm AND uu.data_zm <= trunc(TO_DATE ('2001-07-02', 'YYYY-MM-DD'))
  3. ) )


Powinno zadziałać

Pozostałe punkty w wolnej chwili (jeśli znajdę winksmiley.jpg)

Znowu na szybko, bez sprawdzenia tongue.gif
Ad2) Powinno zadziałać, choć na pewno optymalne to nie jest tongue.gif
  1. SELECT u1.kontrakt_id, decode(u1.STATUS,'a','Aktywna','Deaktywna'),
  2. decode(u2.STATUS,'a','Aktywna','Deaktywna')
  3. FROM uslugi u1,
  4. uslugi u2
  5. WHERE u1.kontrakt_id=u2.kontrakt_id AND u1.usluga_id=10 AND u2.usluga=20 AND u1.data_zm=
  6. (SELECT max(u3.data_zm) FROM uslugi u3 WHERE u3.kontrakt_id=u1.kontrakt_id) AND u2.data_zm=
  7. (SELECT max(u4.data_zm) FROM uslugi u4 WHERE u4.kontrakt_id=u1.kontrakt_id))


Ad3)
Może zadziała a może nie, spróbuj guitar.gif
  1. SELECT u0.kontrakt_id, u0.usluga_id, max(cnt) FROM ( SELECT u1.kontrakt_id, u1.usluga_id, count(u1.usluga_id) cnt
  2. FROM uslugi u1 WHERE u1.STATUS='a' AND data_zm=(SELECT max(u2.data_zm)
  3. FROM uslugi u2 WHERE u2.kontrakt_id=u1.kontrakt_id)
  4. GROUP BY kontrakt_id, usluga_id
  5. ORDER BY 3 DESC ) u0
  6. GROUP BY kontrakt_id, usluga_id
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.