Announcement

Collapse
No announcement yet.

SQL Unterabfrage

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

  • SQL Unterabfrage

    Guten Tag,

    ich wollte Fragen ob mir jemand bei folgender Frage behilflich sein kann:

    Ich habe 2 Tabellen (Tabelle A, Tabelle B). Hier gibt es eine Materialnr(ID), sowie eine dazugehörige k_art(ID).

    Nun möchte ich mir gerne eine Liste ausgeben lassen, in der alle Materialien mit der k_art:

    PA00
    und
    ZA03

    angezeigt werden. Der Trick hierbei soll jedoch sein, dass prinzipiell alle PA00 ausgegeben werden.. gibt es die gleiche Materialnr mit der k_art ZA03, soll zusätzlich hinten eine Spalte mit einem Vermerk oder Hacken bzw. weitere Informationen aus Tabelle B gezogen werden.

    Ich habe Unterabfragen ausprobiert, bin jedoch auf keine Lösung gekommen.

    Vielen Dank & Gruß

  • #2
    Diese Aufgabenstellung klingt nach: "alle aus A" und "soweit vorhanden, passende Angaben aus B" (ich hoffe, ich habe es richtig verstanden). Das wäre dann ein LEFT JOIN, siehe [wikibooks] Einführung in SQL: OUTER JOIN.

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen,

      danke für die Antwort.

      Ich habe die Abfrage mit dem LEFT JOIN erfolgreich gemacht. Jedoch ist mein Ursprungsproblem, dass ich (hier etwas komplexer dargestellt) jedes Material nur 1x in der Tabelle haben will, mit der Angabe ob es auch eine k_art ZA03 hat (PA00 ist immer vorhanden). Hierzu würde ich den PREIS (-40 %) einfach in der gleichen Zeile beim Material anzeigen lassen, ist keine k_art ZA03 vorhanden, ist auch kein Prozentsatz vorhanden den ich in der Zeile anzeigen könnte.

      Hier mal ein Beispiel eines Materials mit einem ZA03 von -40 %

      MATERIALTABELLE A

      MATERIAL k_art PREIS WÄHRUNG
      30001 PA00 10 EUR
      30001 ZA03 -40 %

      MATERIALTABELLE B

      MATERIAL WERT
      30001 A

      Dies möchte ich zusammenfassen zu:

      MATERIAL k_art PREIS PREISZA03 WERT
      30001 PA00 10,00 6,00 A

      Vielen Dank & Gruß

      Comment


      • #4
        Das heißt: Du willst Angaben aus zwei verschiedenen Zeilen von TabA in einer Ausgabezeile zusammenfassen. (Erst danach kommt TabB dazu.) Dazu gibt es das Stichwort SELF JOIN (in deinem Fall als LEFT), das im Wikibooks ebenfalls behandelt wird.

        Jürgen

        Comment


        • #5
          Hi

          Sollte so funktionieren:
          SELECT a.MATERIAL
          , a.k_Art
          , a.Preis
          , ( SELECT z.k_Art FROM MATERIALTABELLE_A as z WHERE z.k_Art = 'ZA03' AND z.MATERIAL = a.MATERIAL ) AS PREISZA03
          , b.WERT
          FROM MATERIALTABELLE_A a
          INNER JOIN MATERIALTABELLE_B b
          ON a.MATERIAL = b.MATERIAL


          Wenn nicht dann bitte melden,

          Gruß
          Zuletzt editiert von _CISS_; 10.03.2010, 13:33. Reason: pssst
          Beste Grüße
          Norbert

          _Code * It * Simple * and * Smile_

          Access: FAQAccess-Funktionen
          SQL: sqlfaq ° sqlservercentral ° databasejournal ° insideSQL
          C#: snippets ° C# Corner ° codeproject ° Free ebook ° Pflichtlektüre
          Was nützt die beste Informationstechnik, wenn sich die Menschen nichts zu sagen haben?”

          Comment


          • #6
            Hi _CISS_,

            danke für den Beispielcode, hat wunderbar geklappt, jedoch hab ich mich mit der Tabellenstruktur verhaspelt. Siehe unten aktuelle Struktur.

            @ Jürgen:

            Du hast soweit schon Recht, es geht jedoch darum, dass ich momentan einen LEFT JOIN mache und momentan ca 10000 Datensätze zu viel angezeigt bekomme, weil es in der MATERIALTABELLE B Duplikate gibt (Materialnr mit PA00 und ZA03), dass sind genau die 10000 die mit ZA03 klassifiziert sind). Deshalb muss ich diese in eine Zeile zusammenfassen.

            Habe das mal auf dem vorherigen Beispiel aufgebaut, diesmal mit richtiger Struktur

            Habe es wieder selber versucht, aber nichts brauchbares gehabt, ich schaffe es einfach nicht Beide Zeilen zu einer zusammenzufassen.

            MATERIALTABELLE A

            MATERIAL
            30001
            30001

            MATERIALTABELLE B

            MATERIAL k_art preis waehrung
            30001 PA00 15.00 EUR
            30001 ZA03 40 %

            Dies möchte ich zusammenfassen zu:

            MATERIAL k_art PREIS_PA00 %_ZA03 %_ZA03_gerechnet
            30001 PA00 15,00 40 9,00

            Danke & Gruß,
            GNewmann

            Comment


            • #7
              Hi

              [highlight=sql]
              SELECT x.MATERIAL
              , x.k_Art
              , x.preis AS PREIS_PA00
              , y.preis AS %_ZA03
              , (x.preis * ( 1 - (y.preis / 100) ) AS %_ZA03_gerechnet --Falls 40 einen 40%igen Rabatt bedeuten
              FROM
              (
              SELECT a.MATERIAL
              , a.k_Art
              , a.preis
              FROM TabelleA AS a
              WHERE a.k_Art = 'PA00'
              ) x
              INNER JOIN
              (
              SELECT b.MATERIAL
              , b.k_Art --40
              , b.preis
              FROM TabelleA AS b
              WHERE b.k_Art = 'ZA03'
              ) y
              ON x.MATERIAL = y.MATERIAL[/highlight]

              Nun aber...

              Gruß
              Zuletzt editiert von _CISS_; 14.03.2010, 01:03. Reason: auf Befehl von...
              Beste Grüße
              Norbert

              _Code * It * Simple * and * Smile_

              Access: FAQAccess-Funktionen
              SQL: sqlfaq ° sqlservercentral ° databasejournal ° insideSQL
              C#: snippets ° C# Corner ° codeproject ° Free ebook ° Pflichtlektüre
              Was nützt die beste Informationstechnik, wenn sich die Menschen nichts zu sagen haben?”

              Comment


              • #8
                _Code * it * Simple * and * Smile_
                Und wie wäre es damit, es lesbar zu schreiben? Sprich: [highlight=sql]SELECT[/highlight] um den Befehl herum und dabei Einrückungen berücksichtigen, die dann nämlich auch sichtbar sind. Jürgen

                Comment


                • #9
                  Hallo

                  Könnte man das nicht etas freundlicher schreiben...
                  In der Standardansicht ist kein Code-Tag - dachte somit es gibt keine Formatierungsmöglichkeit.

                  Also, laß dich nicht ärgern...

                  Gruß
                  Norbert
                  Beste Grüße
                  Norbert

                  _Code * It * Simple * and * Smile_

                  Access: FAQAccess-Funktionen
                  SQL: sqlfaq ° sqlservercentral ° databasejournal ° insideSQL
                  C#: snippets ° C# Corner ° codeproject ° Free ebook ° Pflichtlektüre
                  Was nützt die beste Informationstechnik, wenn sich die Menschen nichts zu sagen haben?”

                  Comment


                  • #10
                    Hallo Norbert,

                    Originally posted by _CISS_ View Post
                    Könnte man das nicht etas freundlicher schreiben...
                    Entschuldigung, so grob sollte es nicht klingen. Ich war nur durch deine Signatur zu einer Reaktion animiert worden.

                    In der Standardansicht ist kein Code-Tag - dachte somit es gibt keine Formatierungsmöglichkeit.
                    Stimmt, aber beim "normalen" Antworten gibt es zumindest den #-Button. Der macht zwar keine Syntaxhervorhebung, aber zeigt (mit den Einrückungen) wenigstens den Code an.

                    Also nichts für ungut, wir haben beide etwas gelernt: du die Formatierung, und ich das Achten auf den Tonfall.

                    Schönen Sonntag! Jürgen

                    Comment


                    • #11
                      Hallo Ihr Beiden,

                      habe die Abfrage ausprobiert. Schaut Super aus! Habe noch einen Left Join draus gemacht, damit ich alle Datensätze sehe.

                      Interessant mit den Unterabfragen zu arbeiten, muss mich mal in das Thema einlesen.

                      Vielen Dank & Gruß,
                      GNewmann

                      Comment

                      Working...
                      X