Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrage: Zeige alle GP's, Wert aus Preisliste, Wert Sonderpreis falls vorhanden. Auswahl nach Artike

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Dtechnik2013, 5 August 2013.

  1. Dtechnik2013

    Dtechnik2013 Benutzer

    Hallo

    versuche schon etwas länger eine SAP Abfrage zu erstellen.

    Die Abfrage soll alle Geschäftspartner auflisten und die VK's für einen "bestimmten Artikel" aus der Preisliste "1" anzeigen.
    Zusätzlich sollen die Sonderpreise falls vorhanden angezeigt werden.


    Die folgende Abfrage gibt nur die Geschäftspartner aus, die einen Sonderpreis hinterlegt haben

    Code:
    SELECT T0.[CardCode], T1.[CardName], T2.[ItemName], T0.[Discount], T0.[Price], T3.[Price], T0.[Currency] 
    FROM OSPP T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode 
    INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode 
    INNER JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist
    WHERE T0.[ItemCode]  = [%ItemCode] AND
    T3.[ItemCode]  = [%ItemCode]
    
     
  2. ukulele

    ukulele Datenbank-Guru

    Die ersten beiden Probleme sind schonmal das du A eigentlich gar keine Frage gepostet hast und B ich kein SAP kann bzw. je angefasst habe. Ohne deine Tabellenstruktur jetzt zu kennen denke ich aber mal das dein Problem bei der Wahl des JOINs liegt. LEFT JOIN dürfte dein Freund sein.
     
  3. Dtechnik2013

    Dtechnik2013 Benutzer

    Hallo,

    es handelt sich ja auch um eine Problemstellung. Left Join funktioniert leider nicht. Das grundlegende Problem ist, dass die Ausgabe sich aufgrund der Sonderpreise reduziert. D.h. Es werden nur kunden mit sonderpreisen angezeigt.
     
  4. ukulele

    ukulele Datenbank-Guru

    Dann poste mal mehr Infos zur Tabellenstruktur. Kommt dein Sonderpreis aus ITM1? Warum läßt sich das nicht per LEFT JOIN lösen? Gibt er eventuell trotzdem was aus, gibt er gar nichts aus oder kommt eine Fehlermeldung?
    Code:
    SELECT    T0.[CardCode],
            T1.[CardName],
            T2.[ItemName],
            T0.[Discount],
            T0.[Price],
            T3.[Price],
            T0.[Currency]
    FROM    OSPP T0
    INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
    INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
    LEFT JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist
    WHERE    T0.[ItemCode]  = [%ItemCode]
    AND    (    T3.[ItemCode]  = [%ItemCode]
    OR        T3.[ItemCode] IS NULL )
     
  5. Dtechnik2013

    Dtechnik2013 Benutzer

    Ok, Sorry,

    So hier die Strucktur:

    OCRD T1 = Geschäftspartner/ Kundenkarteikarte (CardCode, CardName, ListNum)
    OITM T2 = Arikelstammdaten (ItemCode, ItemName,
    ITM1 T3 = Preislisten (ItemCode, PriceList, Price)
    OSPP = Sonderpreise (ItemCode, CardCode, Price, ListNum, Discount)

    Ich hoffe dass es ausreichend ist. Der oben genannte Code gibt leider wieder nur die Geschäftspartner aus, die einen Sonderpreis hinterlegt haben.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ich hoffe, ich hab Dich richtig verstanden. Dazu mal Deine Tabellen mit wenigen Datensätzen angelegt.

    Code:
    test=*# select * from t1;
    cardcode | cardname | listnum
    ----------+----------+---------
            1 | kunde 1  |      1
            2 | kunde 2  |      2
    (2 rows)
     
    Time: 0,174 ms
    test=*# select * from t2;
    itemcode | itemname
    ----------+-----------
            1 | artikel 1
            2 | artikel 2
    (2 rows)
     
    Time: 0,190 ms
    test=*# select * from t3;
    itemcode | pricelist | price
    ----------+-----------+-------
            1 |        1 |    10
            1 |        2 |    12
            2 |        1 |    20
            2 |        2 |    22
    (4 rows)
     
    Time: 0,170 ms
    test=*# select * from t4;
    itemcode | cardcode | price | listnum | discount
    ----------+----------+-------+---------+----------
            1 |        1 |    9 |      1 |      10
    (1 row)
     
    Time: 0,154 ms
    test=*# select t1.cardcode, t1.cardname, default_price.itemname, t3.price as defaultprice, t4.price as speciaprice, coalesce(t4.price,t3.price) as finalprice from t1 left join t3 on (t1.listnum=t3.pricelist) left join t4 on ((t1.cardcode, t1.listnum, t3.itemcode)=(t4.cardcode,t4.listnum,t4.itemcode)) left join t2as default_price on (default_price.itemcode=t3.itemcode) left join t2 as sonder_price on (sonder_price.itemcode=t3.itemcode);
    cardcode | cardname | itemname  | defaultprice | speciaprice | finalprice
    ----------+----------+-----------+--------------+-------------+------------
            1 | kunde 1  | artikel 1 |          10 |          9 |          9
            2 | kunde 2  | artikel 1 |          12 |            |          12
            1 | kunde 1  | artikel 2 |          20 |            |          20
            2 | kunde 2  | artikel 2 |          22 |            |          22
    (4 rows)
     
    Time: 0,844 ms
    test=*#
    
    Ist es das, was Du suchst? Ich arbeite mit PostgreSQL, sollte aber sich auf Deine Aufgabe und Datenbank mühelos anpassen lassen.

    Edit: das auf einen Artikel zu filtern überlasse ich Dir zur Übung ;-)
     
  7. Dtechnik2013

    Dtechnik2013 Benutzer

    Hi akretschmer,

    das funktioniert so mit SQL Server leider nicht. Ich habe versucht es etwas umzustellen. Aber das gibt leider auch weitere Fehler aus. Ich werde das später noch mal mit left joins versuchen.

    Code:
    select OCRD.cardcode, OCRD.cardname, OITM.itemname, ITM1.price, OSPP.price as speciaprice, coalesce(OSPP.price, ITM1.price) as finalprice
    from OCRD left join ITM1 on OCRD.listnum=ITM1.pricelist left join OSPP on ((OCRD.cardcode, OCRD.listnum, ITM1.itemcode)=(OSPP.cardcode, OSPP.listnum, OSPP.itemcode)) left join OITM on (OITM.itemcode=ITM1.itemcode) left join OITM on (sonder_price.itemcode=ITM1.itemcode)
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Wenn Du weiter nur so Salamitaktik machst ist es schwer zu helfen. Wie lautet denn die Fehlermeldung? Möglicherweise kennt M$SQL coalesce() nicht.
     
  9. Dtechnik2013

    Dtechnik2013 Benutzer

    Hi,

    ja, dass ist klar. Die Fehlermeldung sagt leider nicht viel aus. Die Tabellen werden generell in T1, T2, T3, T4 umbenannt: OCRD, OITM, ITM1, OSPP

    So wie hier:
    Code:
    FROM OSPP T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
    INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
    INNER JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist
    Dann können diese auch mit T1, T2, T3, T4 im select angesprochen werden. Wie: Select T1.CardCode

    Fehlermeldung: 1). [Microsoft][SQL Server Native Client 10.0][SQL Server]An expression of non-boolean type specified in a context where a condition is expected, near ','. 2). [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement 'Rahmenvertrag' (OOAT) (s) could not be prepared.


    Scheint ja doch etwas problematischer zu sein als ich zunächst dachte. Eigentlich müsste der Left Join doch genau das
    richtige sein. Funktioniert allerdings nicht. :confused:
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Bei "T1 .ListNum" scheint mir das Leerzeichen nicht nur überflüssig, sondern auch direkt falsch zu sein.
     
  11. ukulele

    ukulele Datenbank-Guru

    Du hast die Falsche Ausgangstabelle. Du suchst im prinzip nach Sonderpreisen und Joinst darauf die restlichen Informationen. Wenn du aber nach Artikeln suchst und dazu, falls vorhanden per LEFT JOIN die Sonderpreise holst sollte es klappen:
    Code:
    SELECT    T3.[CardCode],
            T3.[CardName],
            T0.[ItemName] AS Produkt_Name,
            T2.[Discount] AS Rabatt,
            T1.[Price] AS Preis,
            T2.[Price] AS Sonderpreis,
            T2.[Currency]
    FROM    OITM T0
    INNER JOIN ITM1 T1 ON T1.ItemCode = T0.ItemCode
    LEFT JOIN OSPP T2 ON T2.ItemCode = T0.ItemCode
    LEFT JOIN OCRD T3 ON T3.CardCode = T2.CardCode
    WHERE    T0.ItemCode = [%ItemCode]
     
  12. Dtechnik2013

    Dtechnik2013 Benutzer

    Hi,

    das passt leider noch nicht ganz. Die Kunden werden mehrfach angezeigt für den gleichen Artikel.Das liegt an der Preisliste.
    Dieser Befehl behebt das Problem: T1.[PriceList] = 1

    Allerdings werden wieder nur die Kunden angezeigt, die einen Sonderpreis hinterlegt haben. Evtl. müsste die Suche nach Kunden starten. Allerdings konnte ich damit bisher noch kein Ergebnis erzielen.

    Code:
    SELECT    T3.[CardCode],
            T3.[CardName],
            T0.[ItemName] AS Produkt_Name,
            T2.[Discount] AS Rabatt,
            T1.[Price] AS Preis,
            T2.[Price] AS Sonderpreis,
            T2.[Currency]
    FROM    OITM T0
    INNER JOIN ITM1 T1 ON T1.ItemCode = T0.ItemCode
    LEFT JOIN OSPP T2 ON T2.ItemCode = T0.ItemCode
    LEFT JOIN OCRD T3 ON T3.CardCode = T2.CardCode
    WHERE    T0.ItemCode = [%ItemCode] AND
    T1.[PriceList] = 1
     
  13. ukulele

    ukulele Datenbank-Guru

    Naja klar, ich suche ja mit der Abfrage nach Produkten, hole per INNER JOIN den Preis dazu den es immer gibt, sonst wird mein Produkt nicht angezeigt aufgrund des gewählten INNER JOINs. Per LEFT JOIN hole ich den Sonderpreis, falls es einen gibt. Gibt es einen Sonderpreis, kann ich auch Kundendaten per LEFT JOIN dazu holen. Wenn es aber keinen Sonderpreis gibt, wo kommen dann die Kundendaten her? Das geht aus der Tabellenbeschreibung so noch nicht hervor.
     
  14. Dtechnik2013

    Dtechnik2013 Benutzer

    Hallo ukulele,

    das funktioniert in diesem Fall bei sap etwas anders. Die Kunden haben in der Tabelle OSPP jeder eigene Sonderpreise für ein Produkt hinterlegt. Die Kunden haben in der Tabelle OCRD
    den Kundenname, Kundennummer und die Info über die Preisliste hinterlegt (Standard VK). Zusätzlich kann man dem Kunden einen Sonderpreis geben in der Tabelle OSPP. Diese werden dann vorrangig verwendet. Ich denke das hier der outer join zu tragen kommt.
    Ich werde da auch noch mal ein wenig probieren.
     
  15. ukulele

    ukulele Datenbank-Guru

    Okay wenn ich das richtig verstehe (und ich geb mir wirklich Mühe SAP zu verstehen :) ) dann ist OSPP eigentlich ein Kreuzprodukt aus Kunde und Produkt weil jeder Kunde zu jedem Produkt einen eigenen Preis hat. Da die Sonderpreise in der selben Tabelle stehen müsste jeder Kunde pro Produkt mind. einen Preis dort stehen haben kann aber auch mehrere dort haben.

    Der Preis aus ITM1 entspricht der Preisliste 1 und ist sowas wie der Ausgangswert für neue Kunden, sollte also den "normalen" Preisen in OSPP entsprechen.

    Sind die Annahmen soweit korrekt oder check ich es nicht?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden