Announcement

Collapse
No announcement yet.

SQL- Zeilen gleichzeitig Spalte in view

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

  • SQL- Zeilen gleichzeitig Spalte in view

    Hallo @all,
    bräuchte dringend Hilfe.

    Ich habe eine Rechnungs-Tablle mit verschiedenen Spalten, Rechnunsgnummern die wiederum mehrere Positionen haben.
    Für jede Position wird die Rechnungsnummer mit angezeigt.

    Dann habe ich noch seperate Frachtkosten-Tabelle die ich noch an die Rechnungstabelle joinen möchte.

    Die Frachtkostenspalte in der Rechnungs-Tabelle gibt es nicht, lass ich aber mittels der view mit anzeigen, aber genau da ist mein Problem, denn dann werden mir die Frachtkosten für jede Position angezeigt da ich diese kosten mittels Rechnungsnummer gejoint habe. Mit der laufenden Position joinen kann ich nciht da sie ja noch nicht vorhanden ist.

    Stand jetzt:

    left join
    T_Import_Rechnungstabelle b
    on
    a.Rechnungsnummer = b.Rechnungsnummer

    --> wie kann ich nun dies auf die Position beschränken, bzw. dass die laufende Position meiner Frachtkostentabelle in der Rechnungstabelle angezeigt wird.

    Dachte schon mit distinct, aber bringt denke ich nichts.

    Danke schon mal für Eure Hilfe.

    Grüße
    Bernd

  • #2
    Ich kenne ja die Datenbank nicht und daher auch nicht deren Möglichkeiten, daher nur mal so als Idee (falls ich das Problem richtig verstanden habe): das distinct auf die Tabelle mit den Frachtkosten, damit je Rechnungsnummer die Frachtkosten nur einmal vorkommen:

    left join
    (select distinct Rechnungsnummer, Frachtkosten from T_Import_Rechnungstabelle) as b
    on
    a.Rechnungsnummer = b.Rechnungsnummer


    oder wenn die Frachtkosten auf die Positionen gesplittet sind:

    left join
    (select Rechnungsnummer, SUM(Frachtkosten) as Frachtkosten from T_Import_Rechnungstabelle group by Rechnungsnummer) as b
    on
    a.Rechnungsnummer = b.Rechnungsnummer


    bye,
    Helmut

    PS: beim SQL-Server ab 2005 könnte man auch mit einer CTE arbeiten, falls das so nicht geht - hab's nicht ausprobiert

    Comment


    • #3
      Hallo Helmut,

      super, vielen Dank!
      ja genau, hast du richtig verstanden, die Frachtkosten sollen nur 1x vorkommen, da diese auch eine separate Position, aber gleiche Rechnungsnummer wie in der Tabelle Rechnung haben.

      Ich habe deine Abfrage mit distinct ausprobiert, bringt aber wieder an jeder Position die Frachtkosten.
      Deinen anderen Vorschlag werde ich übernächste Woche testen, muss jetzt gleich zum Flieger.

      Viele Grüße und schönes WE
      Bernd

      Comment


      • #4
        Hallo Bernd,

        ein bisschen mehr Info, wie die Tabellen aufgebaut sind, wäre hilfreich.
        Wenn ich das aber richtig verstanden habe, ist das hier das Problem:
        [highlight=SQL]SET NOCOUNT ON;
        CREATE TABLE #inv
        (id int, invNo varchar(10));
        CREATE TABLE #frag
        (inv_id int, cost money);
        CREATE TABLE #pos
        (inv_id int, pos int, item varchar(10), amount money);
        INSERT INTO #inv VALUES (1, '2009-12345');
        INSERT INTO #frag VALUES(1, 123.45)
        INSERT INTO #pos VALUES(1, 1, 'Maus', 12.95)
        INSERT INTO #pos VALUES(1, 2, 'USB-Stick', 7.95)
        INSERT INTO #pos VALUES(1, 3, 'Kabel', 9.95)
        GO
        -- Einfaches Select; Fracht wird mehrfach ausgewiesen
        SELECT I.invNo, P.pos, P.item, P.amount,
        F.cost
        FROM #inv AS I
        INNER JOIN #pos AS P
        ON I.id = P.inv_id
        LEFT JOIN #frag AS F
        ON I.id = F.inv_id

        SELECT I.invNo, P.pos, P.item, P.amount,
        CASE WHEN P.Pos = (SELECT MAX(pos) FROM #pos WHERE #pos.inv_id = I.id)
        THEN F.cost
        ELSE 0 END AS Cost
        FROM #inv AS I
        INNER JOIN #pos AS P
        ON I.id = P.inv_id
        LEFT JOIN #frag AS F
        ON I.id = F.inv_id

        GO
        DROP TABLE #inv;
        DROP TABLE #frag;
        DROP TABLE #pos;[/highlight]

        [highlight=text]invNo pos item amount cost
        ---------- ----------- ---------- --------------------- ---------------------
        2009-12345 1 Maus 12,95 123,45
        2009-12345 2 USB-Stick 7,95 123,45
        2009-12345 3 Kabel 9,95 123,45

        invNo pos item amount Cost
        ---------- ----------- ---------- --------------------- ---------------------
        2009-12345 1 Maus 12,95 0,00
        2009-12345 2 USB-Stick 7,95 0,00
        2009-12345 3 Kabel 9,95 123,45[/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hallo Bernd,

          wenn das mit dem distinct wieder in allen Zeile steht, habe ich das falsch verstanden und dann hilft mein zweiter Vorschlag auch nicht, dann kommt das woanders her. Die Lösung wird wohl eher so sein wie O.Helper das dir beschrieben hat.

          bye,
          Helmut

          Comment


          • #6
            Hallo O. Helper,

            danke Dir erstmal!

            Ich habs jetzt hier nochmals zur verständlichung, du hattest aber schon richtig verstanden, nur dass die Cost Spalte in meiner Grundtabelle nicht vorhanden ist. So muss ich jetzt zusätzlich eine Spalte und den Eintrag in der View anzeigen lassen.

            Hier nochmal:

            Dies ist meine Grundtabelle (view) an diese dann zusätzlich die Frachtkosten gejoint werden soll
            invNo pos item amount
            --------------------- ----------------- --------------------- ---------------------
            1. 2009-12345 1 Maus 12,95
            2. 2009-12345 2 USB-Stick 7,95
            3. 2009-12345 3 Kabel 9,95



            Spalte Cost und die Zeile mit der pos 4 muss dann gejoint werden damit es dann so aussieht:
            invNo pos item amount cost
            --------------------- ----------------- --------------------- --------------------- ---------------------
            4. 2009-12345 1 Maus 12,95
            5. 2009-12345 2 USB-Stick 7,95
            6. 2009-12345 3 Kabel 9,95
            7. 2009-12345 4 123,45



            Und dies ist noch meine Frachtkostentabelle die nur aus der invNo und Cost besteht
            invNo pos item amount cost
            --------------------- ----------------- --------------------- --------------------- ---------------------
            8. 2009-12345 4 123,45

            mhhh, ich würds dir ja auch gerne jetzt in TSQL reinstellen da es so ziemlich unübersichtlich ist, aber bin ich noch nicht so fit :-(
            in der 3. Tabelle habe ich auf jeden Fall die InvNo, die pos und die cost.
            Zuletzt editiert von hasna; 30.10.2009, 22:17.

            Comment


            • #7
              Originally posted by hwoess View Post
              Hallo Bernd,

              wenn das mit dem distinct wieder in allen Zeile steht, habe ich das falsch verstanden und dann hilft mein zweiter Vorschlag auch nicht, dann kommt das woanders her. Die Lösung wird wohl eher so sein wie O.Helper das dir beschrieben hat.

              bye,
              Helmut
              Hallo Helmut,
              ich hatte es vorhin ausprobiert, war nicht ganz genau das was ich suchte, hat mir aber bei einer Sache wieder sehr weitergeholfen.

              Danke!
              Gruss Bernd

              Comment


              • #8
                Hallo Bernd,

                ich habe schon ein paar mal einen drüber bekommen, weil ich doch "leicht" zu Sarkasmus neige; ich glaube, jetzt ist es mal wieder fällig .
                muss jetzt gleich zum Flieger.
                Flieger verpasst oder Verspätung? Ja, ja, die Öffies, nicht zuverlässig.
                Oder surfst Du on Board? Wunder Dich nicht, wenn der Vogel dann gar nicht landet .. oder wo anders.

                Ganz ehrlich, das hätte ich nie aus Deiner Beschreibung erraten können und aufgrund der dürftigen Beschreibung könnte man nur in die Glaskugel schauen.
                Das Zauberwort heisst UNION, um mehrere Abfragen zu kombinieren, was dann zum gewünschten Ergebnis führt (..sollte):
                [highlight=SQL]SET NOCOUNT ON;
                CREATE TABLE #inv
                (id int, invNo varchar(10));
                CREATE TABLE #frag
                (inv_id int, cost money);
                CREATE TABLE #pos
                (inv_id int, pos int, item varchar(10), amount money);
                INSERT INTO #inv VALUES (1, '2009-12345');
                INSERT INTO #frag VALUES(1, 123.45);
                INSERT INTO #pos VALUES(1, 1, 'Maus', 12.95);
                INSERT INTO #pos VALUES(1, 2, 'USB-Stick', 7.95);
                INSERT INTO #pos VALUES(1, 3, 'Kabel', 9.95);
                GO
                -- Einfaches Select; Fracht wird mehrfach ausgewiesen
                SELECT I.invNo, P.pos, P.item, P.amount
                FROM #inv AS I
                INNER JOIN #pos AS P
                ON I.id = P.inv_id
                UNION ALL
                SELECT I.invNo, 0 AS Pos, 'Fragile' AS item, F.cost AS Amount
                FROM #inv AS I
                LEFT JOIN #frag AS F
                ON I.id = F.inv_id
                GO
                DROP TABLE #inv;
                DROP TABLE #frag;
                DROP TABLE #pos;
                [/highlight]
                Ergebnis:
                [highlight=text]invNo pos item amount
                ---------- ----------- ---------- ---------------------
                2009-12345 1 Maus 12,95
                2009-12345 2 USB-Stick 7,95
                2009-12345 3 Kabel 9,95
                2009-12345 0 Fragile 123,45
                [/highlight]
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Hallo O. Helper,

                  Herzlichen Dank für die superschnelle Antwort.

                  kein Problem, ich kann mit Sarkasmus umgehen ,
                  aber von Düsseldorf nach Nürnberg fliegt man ja nicht ewig und bin jetzt zu Hause.


                  Mit Union hatte ich es schon versucht und hat nicht ganz geklappt, werde es aber nochmals testen.
                  Hintergrund: Bin leider noch nicht 100%ig mit SQL Vertraut da ich noch nicht sooolange damit arbeite, aber die select Anweisung ist verschachtelt und hatte wahrscheinlich 'union' nicht richtig eingesetzt.

                  Werd Bescheid geben wenn ich auf Arbeit bin und es getestet habe.

                  Grüße und schönes WE!
                  Bernd

                  Comment


                  • #10
                    Originally posted by O. Helper View Post
                    Das Zauberwort heisst UNION, um mehrere Abfragen zu kombinieren, was dann zum gewünschten Ergebnis führt (..sollte):
                    Hallo O. Helper,

                    das mit union hat nun funktioniert, hatte es nur an die falsche Stelle gesetzt :-( .
                    Danke Dir nochmals!

                    Gruss Bernd

                    Comment

                    Working...
                    X