hmm: SQL Problem mit DB2

Hi Leute,

in der folgenden query, was mache ich da falsch?

kann es sein dass ich alle preise summiere und nicht nur die retouren?

-- Queryergebnis:
-- Finden Sie Kunden (mit Kundennummer, Name, Telefonnummer und deren Land) und erzeugtem Verlust, den sie durch zurückgegebene Artikel erzeugt haben.
-- Geben Sie nur die Top 20 Kunden aus, die den meisten Verlust erzeugt haben. Hinweis, Retourstatus 'R' bedeutet zurückgegeben.
-- <p/>
-- Ergebnisschema:
-- [Kunden_Nr | Name | Telefon | Land | Verlust (↓)]
-- <p/>
-- Punkte:
-- 8.0//
--
-- @return SQL Query für Aufgabe 22

select Kunden_Nr as kunden_nr, Kunde.Name as Name, Telefon, Land, SUM(Preis) as Verlust
from Kunde
join Bestellung on Bestellung.Kunde = Kunde.Kunden_Nr
join Bestellposten on Bestellposten.Bestell_Nr = Bestellung.Bestell_Nr where Retourstatus = 'R'
group by Kunden_Nr, Kunde.Name , Telefon, Land
order by Verlust DESC
FETCH FIRST 20  ROWS ONLY
  1. Tach!

    in der folgenden query, was mache ich da falsch?

    kann es sein dass ich alle preise summiere und nicht nur die retouren?

    Dazu müsste man die Tabellenstruktur kennen oder aus wenigstens anhand von Tabellennamen vor den Feldnamen sehen können, was woher kommt. Meine Empfehlung ist, statt kartesische Produkte zusammenzujoinen, die dann über GROUP BY eingedampft werden, lieber erstmal die Hauptquery mit dem wesentlichen Ergebnisanteil - hier die Kunden - und die Einzeldaten aus anderen Tabellen über korrierte Subquerys hinzuzufügen. Das hat auch noch den Vorteil, dass du die einzelnen Querys unabhängig voneinander testen kannst. Große Join-Haufen sind da nicht so wartungsfreundlich.

    dedlfix.

    1. das ist das schema, habt ihr eine idee was falsch sein könnte an der query? das ergebnis sieht ganz ok aus

  2. Hallo hmm,

    DB2? Echt DB2? UDB oder so richtig klassisch auf z/OS?

    Auf Anhieb wäre ich der Meinung, dass die Joinerei richtig gemacht sein müsste. Wenn Du meinst, dass was falsch ist, dann rechne doch mal für eine Kundennummer, der Du misstraust, die Werte von Hand nach. Wieso denkst Du denn, dass was falsch ist? Was ist das Symptom?

    Ich hätte die Retour-Bedingung nicht in einen WHERE gelegt, sondern mit AND an die ON Klausel des 2. Join gehängt, aber vermutlich optimiert DB2 das automatisch zurecht.

    Die von Dedlfix empfohlene Subselect-Lösung kann man auch verwenden, aber da gehört dann noch ein WHERE Verlust > 0 hinein, sonst hat man bei wenig Retouren auf einmal ein paar Nuller im Report.

    Rolf

    --
    sumpsi - posui - clusi
    1. db2, gehört zu einer hausaufgabe. leider kann ich die sql query nur einchecken und sehe dann ob sie richtig oder falsch ist.

      bisher ist sie falsch :(

      das einzige was ich tun kann ist den mist solange auszuprobieren bis es klappt

      1. Tach!

        db2, gehört zu einer hausaufgabe. leider kann ich die sql query nur einchecken und sehe dann ob sie richtig oder falsch ist.

        Es gibt noch mehr Möglichkeiten. Beispielsweise sich MySQL zu installieren und mit der MySQL-Workbench bedienen, darin die relevanten Teile der Tabellen nachbauen und ein paar Daten dazu. Auch mit einem XAMPP mit eingebautem phpMyAdmin kann man Teste durchführen. Die Syntax von MySQL ist zwar geringfügig anders, aber in den für die Aufgabenstellung wesentlichen Teilen ist kein großer Unterschied.

        das einzige was ich tun kann ist den mist solange auszuprobieren bis es klappt

        Ja, so macht man das, wenn Wissen und Erfahrung fehlen. Unter anderem damit sammelt man beides.

        dedlfix.

        1. Hallo dedlfix,

          Beispielsweise sich MySQL zu installieren…

          Alternativ fiddelt man sich einen: http://sqlfiddle.com/

          Rolf

          --
          sumpsi - posui - clusi
      2. Hallo hmm,

        d.h. nach dem Einchecken wird die SQL Query vom Aufgabensystem auf eine DB mit einem Dir unbekannten Inhalt losgelassen und die Ausgabe mit dem erwarteten Inhalt verglichen? Sowas hat mein Sohn an der Fernuni Hagen auch tun müssen - mit irgendwelchen Java Klassen.

        Je nach dem, wie stupide die Kontrolle programmiert ist, kann bereits die Abweichung in der Groß-/Kleinschreibung der Spaltennamen, die Du mit Kunden_Nr as kunden_nr erzeugst, zur Ablehnung der Einsendung führen.

        Rolf

        --
        sumpsi - posui - clusi
        1. jau genau sowas.

          mein problem ist das ich nichts haben zum db2 testen. ich überlege ob ich versuche db2 zu installieren (auf ubuntu) falls das gratis ist oder ob ich alternativ mit sqlite3 oder mysql arbeite und die syntax dann anpasse

          kennt jemand eine gute übersichtsseite zu db2 befehlen mit beispielen? wenn ich zb "db2 varchar" google stoße ich zb nicht auf die info dass man die bytezahl "name varchar(40)" dahinterhämmern kann.

          1. Hallo hmm,

            das ist DB2 - also IBM. Das Einzige, was man da gratis bekommt, ist eine Kaffeetasse, wenn man an einem Seminar teilnimmt. Und Dokumentation. Reichlich.

            Vielleicht hilft Dir das hier weiter: ftp://public.dhe.ibm.com/ps/products/db2/info/xplatsql/pdf/en_US/cpsqlrv5.pdf das scheint mir halbwegs aktuell zu sein (DB2 Versionen siehe Seite 2).

            Der Einstieg ist hier

            Informationen zu älteren DB2-Versionen sollten sich da auch finden lassen, wenn ihr 10.5 nicht habt; aber der SQL Kern, der für dich relevant ist, dürfte seit 20 Jahren unverändert sein. VARCHAR(n) gibt's auf jeden Fall, mit n<=32767.

            Edit: Ich korrigiere mich. Es gibt Trial-Versionen für den Nichtkommerziellen Gebrauch. Du musst Dich aber registrieren. Meine Erfahrung mit DB2 ist, dass Du dafür ein paar Gigabyte spendieren musst, dass die Tools extuitiv sind (=Gegenteil von intuitiv) und die verwendete Terminologie gerne IBM-spezifisch ist.

            Rolf

            --
            sumpsi - posui - clusi