WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   PL/SQL Frage! (http://www.wcm.at/forum/showthread.php?t=208591)

creibl 25.01.2007 10:26

PL/SQL Frage!
 
Hallo zusammen,

habe folgendes Problem:

In einer (Oracle) Tabelle gibt es folgende 4 Felder:
Artikel_NR, Artikel_Bez, Verkauf_Menge, Verkauf_Dat, Verkaeufer_Name

Jetzt möchte ich pro Artikel die letzten 5 Verkäufe (mit allen Infos) und den ersten Verkauf sehen.

Wie stelle ich das am Besten an???

Danke für eure Hilfe!

lg

pc.net 25.01.2007 11:31

um dein problem besser zu verstehen:

ein artikel wurde zb. 269 verkaut, du willst jetzt anhand des datums also folgende ausgabe bekommen:


VKNR ... Art_NR ... Artikel_Bez ........ VK_Menge ... Verkauf_Dat ... VK_Name
269 .... 4711 ..... Köllnisch-Wasser ... 250 ........ 23.01.2007 .... Charly
268 .... 4711 ..... Köllnisch-Wasser ... 110 ........ 12.01.2007 .... Hannes
267 .... 4711 ..... Köllnisch-Wasser ... 380 ........ 08.01.2007 .... Jutta
266 .... 4711 ..... Köllnisch-Wasser ... 630 ........ 19.12.2006 .... Sandra
265 .... 4711 ..... Köllnisch-Wasser ... 180 ........ 17.12.2006 .... Heinz
1 ...... 4711 ..... Köllnisch-Wasser ... 100 ........ 01.03.1997 .... Chefin


T.dot 25.01.2007 11:49

Eine Möglichkeit wäre:
(SELECT * FROM
(SELECT * FROM TabellenName ORDER BY Verkauf_Dat DESC)
WHERE ROWNUM < 6)
UNION ALL
(SELECT * FROM
(SELECT * FROM TabellenName ORDER BY Verkauf_Dat ASC)
WHERE ROWNUM<2)

Vl. gehts schöner auch, ka.

creibl 25.01.2007 12:17

Ja so ungefähr brauch ich das. Danke.

Nur, es gibt in dieser Tabelle nicht nur einen Artikel sondern xxxxx. Womit das mit den rownums nicht ganz so funktioniert => Liefert nur die letzten 5, aber nicht die letzten fünf PRO Artikel .......

Andere/Zusätzliche Ideen ?????

lg

pc.net 25.01.2007 16:29

*) selektiere die daten sortiert nach art-nr. (beliebig) und datum (absteigend)
*) mach einen loop über die gelieferten sätze
*) gib dir die sätze mit zähler in (1, 2, 3, 4, 5, gesamt-anzahl an sätzen zu diesem artikel) aus ... [gesamt-anzahl an sätzen zu diesem artikel mußt du separat ermitteln]
*) gruppenwechsel bei nächstem artikel nicht vergessen

pc.net 25.01.2007 16:52

hab da jetzt schnell mal was runtergetippt - und bedingt getestet.
Code:

set serveroutput on
declare
  cursor c_art is
    select art.*
    from artikel art
    order by artnr, verkauf_dat desc
    ;

  cursor c_anzahl_pro_art (p_artnr in number) is
    select count(1)
    from artikel
    where artnr = p_artnr
    ;

  v_artnr_vorh artikel.artnr%TYPE := 0;
  v_anzahl    number := 0;
  v_zaehler    number := 0;

begin
  for r_art in c_art loop
    if r_art.artnr != v_artnr_vorh then
      -- Gruppenwechsel, Zähler zurücksetzen
      -- und Anzahl der Sätze pro Artikel ermitteln
      v_zaehler := 0;
      open c_anzahl_pro_art (r_art.artnr);
        fetch c_anzahl_pro_art into v_anzahl;
      close c_anzahl_pro_art;
      dbms_output.put_line('Sätze pro ArtNr ' || r_art.artnr || ': ' || to_char(v_anzahl));
    end if;

    v_zaehler := v_zaehler + 1;

    if v_zaehler in (1,2,3,4,5,v_anzahl) then
      dbms_output.put_line(r_art.artnr || ' ' || r_art.verkauf_dat || ' ' ||  r_art.vk_menge);
    end if;

    v_artnr_vorh := r_art.artnr;
  end loop;
end;
/



gibt sicherlich interessantere lösungsmöglichkeiten auch noch ;) ...

creibl 26.01.2007 09:22

Hi,

danke. Hab das mittlerweile allerdings anders gelöst.

Erzeug mir eine neue Tabelle in der ich mithilfe der LEAD Funktionen pro Artikel genau EINEN Datensatz mit allen Infos reinschreibe.

Also in etwa so:

Artikel_NR, Artikel_Bez, DAT_LETZTER_VK, MENGE_LETZTER_VK, VERK_LETZTER_VK, DAT_VORLETZTER_VK, MENGE_VORLETZTER_VK, VERK_VORLETZTER_VK, usw. bishin zu DAT_ERSTER_VK, MENGE_ERSTER_VK, VERK_ERSTER_VK.

Aus dieser Tabelle lese ich dann einfach aus.

Gibt zwar sicherlich elegantere Methoden, aber es funzt......

Danke für eure Hilfe.

lg


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag