Announcement

Collapse
No announcement yet.

Problem als SQL-Frischling

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem als SQL-Frischling

    Ich habe ein Problem. Ich soll eine Übersicht aus einer riesigen Datenbank erstellen, die zurzeit per Hand gemacht wird. Der SQL-Code steht unten.

    Ich versteh nicht viel von SQL-Befehlen, versteh aber was da bisher steht. Mein Problem ist, dass ich auf der einen Seite BEstellungen habe und auf der anderen Seite Rechnungen und die sollen einander zugeordnet werden. Das Problem ist, dass nicht zu allen Bestellungen bereits Rechnungen vorhanden sind und mit diesen SQL Befehlen nur die Daten eingetragen werden, die schon Rechnungen haben. Kurz gesagt das Problem ist, dass die Zeile EKRechnungsPosDetail.BestellNr = Bestellpositionen.BestellNr mir alle Positionen rausschmeist, wo die BestellNr nicht in EKRechnungsPosDetail eingetragen ist (Hintergrund: weil keine Rechnung eingegeben ist).

    Mit schwebt auch so in etwa im Kopf rum, dass das was mit left join oder sowas zu tun hat, ich hab aber keine Ahnung, wie ich das anwende. Was dabei rauskommen soll ist, dass alle Bestellungen aufgeführt sind und bei denen, wo eine REchnung hinterlegt ist, diese dazugefügt wird.

    Bitte helft mir, es ist dringend.

    Nun also der Quelltext:

    SELECT
    Bestellkoepfe.DatumBestellung AS 'Datum',
    Bestellkoepfe.BestellNr,
    Bestellkoepfe.Referenz, Bestellkoepfe.Name1 AS 'Lieferant',
    Bestellpositionen.ArtikelbezLieferant AS 'Artikel', Bestellpositionen.DatumWE AS 'Liefertermin',
    Lieferpositionen.ChargenNr AS 'WE', EKRechnungskoepfe.Referenz AS 'Rg',
    Bestellpositionen.Ursprungsmenge AS 'Menge', Bestellpositionen.PreisProEinheit AS 'E-Preis',
    Bestellpositionen.WarenwertFremd AS 'Nettowert', Bestellpositionen.UStSchluessel


    FROM
    quarisPROMIXDaten.dbo.Bestellkoepfe Bestellkoepfe,
    quarisPROMIXDaten.dbo.Bestellpositionen Bestellpositionen,
    quarisPROMIXDaten.dbo.EKRechnungskoepfe EKRechnungskoepfe,
    quarisPROMIXDaten.dbo.EKRechnungsPosDetail EKRechnungsPosDetail,
    quarisPROMIXDaten.dbo.EKRechnungspositionen EKRechnungspositionen,
    quarisPROMIXDaten.dbo.Lieferpositionen Lieferpositionen


    WHERE

    Bestellkoepfe.BestellNr = Bestellpositionen.BestellNr AND
    Bestellkoepfe.BestellNr = Lieferpositionen.BestellNr AND
    Bestellpositionen.BestellNr = Lieferpositionen.BestellNr AND EKRechnungsPosDetail.BestellNr = Bestellpositionen.BestellNr AND
    EKRechnungsPosDetail.EKRechnungsNr = EKRechnungskoepfe.EKRechnungsNr AND
    EKRechnungspositionen.EKRechnungsNr = EKRechnungskoepfe.EKRechnungsNr AND
    EKRechnungspositionen.EKRechnungsNr = EKRechnungsPosDetail.EKRechnungsNr AND
    EKRechnungsPosDetail.Bestellposition = Bestellpositionen.Bestellposition AND
    Lieferpositionen.Bestellposition = EKRechnungsPosDetail.Bestellposition AND

    Lieferpositionen.Bestellposition = Bestellpositionen.Bestellposition AND
    EKRechnungsPosDetail.Jahr = EKRechnungskoepfe.Jahr AND EKRechnungsPosDetail.EKRechnungsposition =

    EKRechnungspositionen.EKRechnungsposition AND


    ((Bestellkoepfe.DatumBestellung>{ts '2009-01-01 00:00:00'}))

  • #2
    Hallo StormedPilotin,

    Originally posted by StormedPilotin View Post
    Ich habe ein Problem. ... Mit schwebt auch so in etwa im Kopf rum, dass das was mit left join oder sowas zu tun hat, ich hab aber keine Ahnung, wie ich das anwende. Was dabei rauskommen soll ist, dass alle Bestellungen aufgeführt sind und bei denen, wo eine REchnung hinterlegt ist, diese dazugefügt wird.
    Also LEFT (OUTER) JOIN ist doch schonmal ein guter Ansatz und auch des Rätsels (Problems) Lösung. Drösel die impliziten INNER JOINS einfach in explizite auf und Ersetze die notwendigen durch OUTER JOINS.

    [highlight=sql]
    SELECT
    Bestellkoepfe.DatumBestellung AS 'Datum',
    Bestellkoepfe.BestellNr,
    Bestellkoepfe.Referenz,
    Bestellkoepfe.Name1 AS 'Lieferant',
    Bestellpositionen.ArtikelbezLieferant AS 'Artikel',
    Bestellpositionen.DatumWE AS 'Liefertermin',
    Lieferpositionen.ChargenNr AS 'WE',
    EKRechnungskoepfe.Referenz AS 'Rg',
    Bestellpositionen.Ursprungsmenge AS 'Menge',
    Bestellpositionen.PreisProEinheit AS 'E-Preis',
    Bestellpositionen.WarenwertFremd AS 'Nettowert',
    Bestellpositionen.UStSchluessel
    FROM quarisPROMIXDaten.dbo.Bestellkoepfe Bestellkoepfe
    inner join quarisPROMIXDaten.dbo.Bestellpositionen Bestellpositionen
    on Bestellpositionen.BestellNr = Bestellkoepfe.BestellNr
    inner join quarisPROMIXDaten.dbo.Lieferpositionen Lieferpositionen
    on Lieferpositionen.BestellNr = Bestellkoepfe.BestellNr
    AND Lieferpositionen.Bestellposition = Bestellpositionen.Bestellposition
    left outer join quarisPROMIXDaten.dbo.EKRechnungsPosDetail EKRechnungsPosDetail
    on EKRechnungsPosDetail.BestellNr = Bestellpositionen.BestellNr
    AND EKRechnungsPosDetail.Bestellposition = Lieferpositionen.Bestellposition
    left outer join quarisPROMIXDaten.dbo.EKRechnungskoepfe EKRechnungskoepfe
    on EKRechnungskoepfe.EKRechnungsNr = EKRechnungsPosDetail.EKRechnungsNr
    and EKRechnungskoepfe.Jahr = EKRechnungsPosDetail.Jahr
    left outer join quarisPROMIXDaten.dbo.EKRechnungspositionen EKRechnungspositionen
    on EKRechnungspositionen.EKRechnungsNr = EKRechnungsPosDetail.EKRechnungsNr
    where Bestellkoepfe.DatumBestellung>{ts '2009-01-01 00:00:00'}
    [/highlight]
    Ich hoffe ich habs richtig aufgedröselt und auch nur wirkliche Redundanzen weggelassen, also bitte nochmal prüfen

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Danke

      danke schonmal für die Lösung, das hätte ich so nicht hinbekommen. Funktioniert wunderbar. Ich schau mir jetz nochmal den Quellcode an, vielleicht kann ich es danach ja mal allein
      Zuletzt editiert von StormedPilotin; 17.11.2009, 09:25.

      Comment


      • #4
        ich hab noch eine Frage: was mach ich falsch. Ich möchte jetzt anstatt UstSchlüssel direkt den Bruttowert berechnet aus UstSchlüssel und Nettowert machen. Im UstSchlüssen steht V (Voll) H (Halb) und K (Keine) oder etwas anderes (kein Eintrag). Was mach ich falsch. ICh bekomme einen Fehler in der Nähe von If

        Code:
        SELECT     Bestellkoepfe.DatumBestellung, Bestellkoepfe.BestellNr, Bestellkoepfe.Referenz, Bestellkoepfe.Name1, Bestellpositionen.ArtikelbezLieferant, 
                              Bestellpositionen.DatumWE, Lieferpositionen.ChargenNr, EKRechnungskoepfe.Referenz, Bestellpositionen.Ursprungsmenge, 
                              Bestellpositionen.PreisProEinheit, Bestellpositionen.WarenwertFremd, 
        
        
        IF (Bestellpositionen.UstSchluessel = [V]; Bestellpositionen.WarenwertFremd * 1. 19; 
        IF (Bestellpositionen.UstSchluessel = [H]; Bestellpositionen.WarenwertFremd * 1. 07; 
        IF (Bestellpositionen.UstSchluessel = [K]; Bestellpositionen.WarenwertFremd; [-]))) AS BruttoWert, 
        
        Bestellpositionen.UStSchluessel
        FROM         quarisPROMIXDaten.dbo.Bestellkoepfe Bestellkoepfe INNER JOIN
                              quarisPROMIXDaten.dbo.Bestellpositionen Bestellpositionen ON Bestellpositionen.BestellNr = Bestellkoepfe.BestellNr INNER JOIN
                              quarisPROMIXDaten.dbo.Lieferpositionen Lieferpositionen ON Lieferpositionen.BestellNr = Bestellkoepfe.BestellNr AND 
                              Lieferpositionen.Bestellposition = Bestellpositionen.Bestellposition LEFT OUTER JOIN
                              quarisPROMIXDaten.dbo.EKRechnungsPosDetail EKRechnungsPosDetail ON EKRechnungsPosDetail.BestellNr = Bestellpositionen.BestellNr AND 
                              EKRechnungsPosDetail.Bestellposition = Lieferpositionen.Bestellposition LEFT OUTER JOIN
                              quarisPROMIXDaten.dbo.EKRechnungskoepfe EKRechnungskoepfe ON 
                              EKRechnungskoepfe.EKRechnungsNr = EKRechnungsPosDetail.EKRechnungsNr AND 
                              EKRechnungskoepfe.Jahr = EKRechnungsPosDetail.Jahr LEFT OUTER JOIN
                              quarisPROMIXDaten.dbo.EKRechnungspositionen EKRechnungspositionen ON 
                              EKRechnungspositionen.EKRechnungsNr = EKRechnungsPosDetail.EKRechnungsNr
        WHERE     Bestellkoepfe.DatumBestellung >= { ts '2009-01-01 00:00:00' }

        Comment


        • #5
          Hallo,

          also der Vergleich = [V] sollte wohl eher = 'V' heißen und das Leerzeichen zwischen 1. und 19 sollte auch weg.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            oh ja natürlich,

            hab es inzwischen auch hinbekommen.

            Danke

            Sitze jetzt an meinem nächsten Problem, aber da muss ich noch bisschen gucken.

            Comment

            Working...
            X