Problem z group by

0

Witam wszystkich, zwracam się do was o pomoc w rozwiązaniu problemu z Group by. Mianowicie mam funkcję. (Oracle i PL/SQL)

CREATE OR REPLACE FUNCTION E(PAR_ZMIENNA IN VARCHAR2,PAR_NUMER IN VARCHAR2,PAR_MIESIAC IN VARCHAR2,PAR_ROK IN VARCHAR2)
  RETURN TABELA_EWI
  PIPELINED AS
BEGIN

  IF PAR_NUMER = 'ALL' THEN
    BEGIN
      FOR cur IN (SELECT LTRIM(RTRIM(KG.numer ||'-'|| K1.numer ||'-'|| K2.numer ||'-'|| K3.numer,'-'),'-') "Numer konta",LTRIM(RTRIM(KG.nazwa||'-'|| K1.nazwa ||'-'|| K2.nazwa||'-'|| K3.nazwa,'-'),'-') "Nazwa konta",S.INDEKS "Index",S.NAZWA "Nazwa towaru",SUM(p.CENA_ * p.ILOSC_PRZYJETA) "Obrót" FROM SKLADNIK S INNER JOIN KONTO_KSIEGOWE K ON K.SKLADNIK_KF=S.ID_SKLADNIK
INNER JOIN CZLON_KONTO_3 K3 ON K.CZLON_3_KF=K3.ID_CZLON_KONTO_3
INNER JOIN CZLON_KONTO_2 K2 ON K3.CZLON_2_KF=K2.ID_CZLON_KONTO_2
INNER JOIN CZLON_KONTO_1 K1 ON K2.CZLON_1_KF=K1.ID_CZLON_KONTO_1
INNER JOIN CZLON_KONTO_GLOWNY KG ON K1.CZLON_G_KF=KG.ID_CZLON_KONTO_GLOWNY
inner join dokument_pz p on p.skladnik_kf=s.id_skladnik

WHERE TO_CHAR(p.DATA_WYSTAWIENIA, 'YYYY')=PAR_ROK
group by LTRIM(RTRIM(KG.numer ||'-'|| K1.numer ||'-'|| K2.numer ||'-'|| K3.numer,'-'),'-'),LTRIM(RTRIM(KG.nazwa||'-'|| K1.nazwa ||'-'|| K2.nazwa||'-'|| K3.nazwa,'-'),'-') ,S.INDEKS,S.NAZWA
order by numer) LOOP
        PIPE ROW(TYP_EWI_KONTA(CUR."Numer konta",
                          CUR."Nazwa konta",
                          CUR."Index",
                          CUR."Nazwa towaru",
                          CUR."Obrót"));
      END LOOP;
      RETURN;
    END;
    END IF;
 end;

 --select * from table(e('','ALL','',''))

nie wyświetla błędów ale jak próbuje ją wywołać to wywala mi komunikat "not a GROUP BY expression" kiedy zmienię nazwy kolumn na aliasy w klauzuli GROUP BY wywala mi komunikat "alias : invalid identifier" Nie wiem co mam z tym zrobić. Proszę o jakąkolwiek pomoc w rozwiązaniu tego problemu.

0

Spróbuj tak:

CREATE OR REPLACE FUNCTION E (
  PAR_ZMIENNA                    IN VARCHAR2
 ,PAR_NUMER                      IN VARCHAR2
 ,PAR_MIESIAC                    IN VARCHAR2
 ,PAR_ROK                        IN VARCHAR2
)
  RETURN TABELA_EWI
  PIPELINED
AS
BEGIN
  IF PAR_NUMER = 'ALL'
  THEN
    BEGIN
      FOR cur
      IN (  SELECT "Numer konta"
                  ,"Nazwa konta"
                  ,"Index"
                  ,"Nazwa towaru"
                  ,SUM ("Obrót") "Obrót"
              FROM (SELECT LTRIM (RTRIM (KG.numer || '-' || K1.numer || '-' || K2.numer || '-' || K3.numer, '-'), '-')
                             "Numer konta"
                          ,LTRIM (RTRIM (KG.nazwa || '-' || K1.nazwa || '-' || K2.nazwa || '-' || K3.nazwa, '-'), '-')
                             "Nazwa konta"
                          ,S.INDEKS "Index"
                          ,S.NAZWA "Nazwa towaru"
                          ,p.CENA_ * p.ILOSC_PRZYJETA "Obrót"
                      FROM             SKLADNIK S
                                     INNER JOIN
                                       KONTO_KSIEGOWE K
                                     ON K.SKLADNIK_KF = S.ID_SKLADNIK
                                   INNER JOIN
                                     CZLON_KONTO_3 K3
                                   ON K.CZLON_3_KF = K3.ID_CZLON_KONTO_3
                                 INNER JOIN
                                   CZLON_KONTO_2 K2
                                 ON K3.CZLON_2_KF = K2.ID_CZLON_KONTO_2
                               INNER JOIN
                                 CZLON_KONTO_1 K1
                               ON K2.CZLON_1_KF = K1.ID_CZLON_KONTO_1
                             INNER JOIN
                               CZLON_KONTO_GLOWNY KG
                             ON K1.CZLON_G_KF = KG.ID_CZLON_KONTO_GLOWNY
                           INNER JOIN
                             dokument_pz p
                           ON p.skladnik_kf = s.id_skladnik
                     WHERE TO_CHAR (p.DATA_WYSTAWIENIA, 'YYYY') = PAR_ROK)
          GROUP BY "Numer konta"
                  ,"Nazwa konta"
                  ,"Index"
                  ,"Nazwa towaru"
          ORDER BY "Numer konta")
      LOOP
        PIPE ROW (TYP_EWI_KONTA (CUR."Numer konta", CUR."Nazwa konta", CUR."Index", CUR."Nazwa towaru", CUR."Obrót"));
      END LOOP;

      RETURN;
    END;
  END IF;
END;
0

Witam, dzięki za zainteresowanie niestety to nie pomaga bo w takim wypadku dostaje komunikat np. " "Nazwa Towaru" : invalid identifier". Może jakiś inny pomysł ?? Pozdrawiam!

0

I koniecznie musi tam być suma.

0

Zapodaj skrypt tworzący tabele...

1 użytkowników online, w tym zalogowanych: 0, gości: 1