Temat: Funkcje analityczne

Witajcie,
mam problem ze stworzeniem macierzy wykorzystując funcke analityczne.
Mam tabele

CREATE TABLE "TRANSAKCJE" (
"ID_TRANSAKCJI" NUMBER(12, 0) NOT NULL ENABLE,
"NR_KONTA" VARCHAR2(30) NOT NULL ENABLE,
"DATA" DATE NOT NULL ENABLE,
"KWOTA" NUMBER(10, 2) NOT NULL ENABLE,
"TYP" VARCHAR2(10),
"KATEGORIA" VARCHAR2(20));

Chciałbym uzyskać poniższy wynik (coś jak tabela przestawna w Excelu)

NR_KONTA WPŁATA WYPŁATA ŚREDNIA:
11-11111111 1400,00 -257,83 467,47
22-22222222 1487,50 -300,06 593,72
33-33333333 1271,43 -225,61 429,34
ŚREDNIA: 1390,91 -259,67 496,84

jest to niejako przekształcony w tabelę przestawną wynik zapytania:
SELECT nr_konta, typ, avg(kwota)
FROM transakcje
GROUP BY cube(nr_konta, typ)
ORDER BY nr_konta, typ

którego wynikiem jest:
NR_KONTA TYP AVG(KWOTA)
--------------- ---------- ----------
11-11111111 WPŁATA 1400,00
11-11111111 WYPŁATA -257,83
11-11111111 467,47
22-22222222 WPŁATA 1487,50
22-22222222 WYPŁATA -300,06
22-22222222 593,72
33-33333333 WPŁATA 1271,43
33-33333333 WYPŁATA -225,61
33-33333333 429,34
WPŁATA 1390,91
WYPŁATA -259,67
496,84
Napisałem takiego selecta:

select DECODE(NR_KONTA,null,'srednia',NR_KONTA) NUMER_KONTA,
ROUND(AVG(DECODE(KWOTA,'Wpłata','pusta',KWOTA)),2)WPLACONO,
ROUND(AVG(DECODE(KWOTA,'Wypłata','jakas',KWOTA)),2) WYPLACONO,
ROUND(AVG(kwota),2) srednia
from TRANSAKCJE
group by grouping sets(NR_KONTA,())

i zwraca on
NUMER_KONTA WPLACONO WYPLACONO SREDNIA
------------------------------ ---------------------- ---------------------- ----------------------
11-11111111 710,79 710,79 710,79
22-22222222 811,5 811,5 811,5
33-33333333 650,79 650,79 650,79
srednia 726,72 726,72 726,72

Czyli średnia dla wpłat i wypłat jest taka sama a w rzeczywistości tak nie jest.
Nie wiem co powinienem zmienić w zapytaniu?

dzięki za pomoc:)Maciej Kamela edytował(a) ten post dnia 03.01.12 o godzinie 19:01

Temat: Funkcje analityczne

głupio tak samu sobie odpowiadać ale chyba udało mi się rozwiązać problem:

select DECODE(NR_KONTA,null,'srednia',NR_KONTA) NUMER_KONTA,
ROUND(AVG(DECODE(TYP,'W PŁATA',KWOTA)),2)WPLACONO,
ROUND(AVG(DECODE(typ,'WYPŁATA',KWOTA)),2) WYPLACONO,
ROUND(AVG(kwota),2) srednia
from TRANSAKCJE
group by grouping sets(NR_KONTA,())

wynik:
nr_konta wplacono wyplacono srednia(dla kont)
11-11111111 825 -120,5 710,79
22-22222222 910 -130,5 811,5
33-33333333 740 -110,5 650,79
srednia 825 -120,5 726,72
mam nadzieje, że nie ma błedu bo sporo czasu potrzebowałem na to rozwiązanie:)
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Funkcje analityczne

Witaj,
Jeśli pracujesz na 11g to polecam użycie funkcji PIVOT, która dosłownie realizuje tabele przestawne :)

http://www.oracle-developer.net/display.php?id=506

Pozdrawiam
Kamil.

Temat: Funkcje analityczne

WItam,
Używam wersji express edition nie wiem czy w niej pivot i unpivot jest obsługiwany. Jak by wtedy wyglądało moje rozwiązanie?
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Funkcje analityczne

Podeślij zawartość tabelki, coby na sucho nie pisać. Jakiś eksport czy coś.

P.S.
SQL działa tak samo bez względu na wersję - dotyczy to również takich zabawek jak modelowanie.Kamil Stawiarski edytował(a) ten post dnia 04.01.12 o godzinie 22:56

Następna dyskusja:

Oracle - funkcje analityczne




Wyślij zaproszenie do