WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 25.01.2007, 10:26   #1
creibl
Veteran
 
Registriert seit: 24.04.2002
Beiträge: 278


Standard 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
creibl ist offline   Mit Zitat antworten
Alt 25.01.2007, 11:31   #2
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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

____________________________________
Praktizierender Eristiker

No hace falta ser un genio para saber quién dijo eso.
Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein.
pc.net ist offline   Mit Zitat antworten
Alt 25.01.2007, 11:49   #3
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard

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.
T.dot ist offline   Mit Zitat antworten
Alt 25.01.2007, 12:17   #4
creibl
Veteran
 
Registriert seit: 24.04.2002
Beiträge: 278


Standard

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
creibl ist offline   Mit Zitat antworten
Alt 25.01.2007, 16:29   #5
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

*) 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
____________________________________
Praktizierender Eristiker

No hace falta ser un genio para saber quién dijo eso.
Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein.
pc.net ist offline   Mit Zitat antworten
Alt 25.01.2007, 16:52   #6
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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 ...
____________________________________
Praktizierender Eristiker

No hace falta ser un genio para saber quién dijo eso.
Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein.
pc.net ist offline   Mit Zitat antworten
Alt 26.01.2007, 09:22   #7
creibl
Veteran
 
Registriert seit: 24.04.2002
Beiträge: 278


Standard

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
creibl ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:20 Uhr.


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