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

Mehre Spalten in einer Spalte ausgeben und mit Right Join verbinden

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von DarkX7R, 17 Juli 2020.

  1. DarkX7R

    DarkX7R Neuer Benutzer

    Hallo,

    ich bin relativ neu was SQL angeht. Ich habe 2 Datenbanken. Einen Artikelstamm und einen Lagerbestand. Ich möchte alle Artikel aus dem Artikelstamm und die dazugehörigen Bestände. Mir ist klar das ich das Ganze mit right bzw. left join erreichen kann.

    Nur habe ich das Problem, dass ich nicht eine eindeutige Spalte für den Artikel habe, sondern 5.
    Artikelnummer + Farbe + Breite + Sove + Form

    Ich habe es auch erreicht, diese 5 Spalten mir in einer auszugeben.

    Nur scheitere ich aktuell daran, die neu kreierten Spalten miteinander zu verknüpfen.

    Ich hoffe jemand hat eine Idee, wie man mein Problem lösen kann.
     
  2. Dukel

    Dukel Datenbank-Guru

    Dann erstelle doch eine (interne) eindeutige Spalte.
     
  3. DarkX7R

    DarkX7R Neuer Benutzer

    Bisher habe ich meine Datenbanken immer mit Access gebaut. Dort habe ich mir dann 2 Hilfstabellen angelegt, wo ich jeweils die eindeutige Spalte erstellt habe. Damit konnte ich dann in der nachfolgenden Abfrage die neuen Spalten hernehmen.

    Nur verwende ich jetzt ein Programm mit dem ich auf die Live Datenbanken aus unserem ERP-System zugreife. Dementsprechend kann ich nicht die Basis Datenbanken ändern, sondern muss meine Abfrage so hinbekommen, dass ich das gewünschte Ergebnis erreiche.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    um das mal versuchen nachzuvollziehen, mit 3 Spalten als PK/FK:

    Code:
    test=*# create table artikel (nummer int, farbe text, breite int, name text, primary key (nummer, farbe, breite));
    CREATE TABLE
    test=*# create table bestand(nummer int, farbe text, breite int, anzahl int, foreign key(nummer,farbe,breite) references artikel);
    CREATE TABLE
    test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
     nummer | farbe | breite | name | sum
    --------+-------+--------+------+-----
    (0 rows)
    
    test=*#
    
    Achtung: das ist kein M$SQL, Syntax kann da anders sein.
     
  5. ukulele

    ukulele Datenbank-Guru

    Ich glaube du suchst einfach einen passenden Join. Beispiel:
    Code:
    SELECT * FROM tabelle1 t1 LEFT JOIN tabelle2 t2 ON t1.spalte1 = t2.spalte1 AND t1.spalte2 = t2.spalte2 AND t1.spalte3 = t2.spalte3 AND t1.spalte4 = t2.spalte4 AND t1.spalte5 = t2.spalte5
    Ist natürlich mühsam, ein künstlicher Primärschlüssel würde sich anbieten.
     
  6. DarkX7R

    DarkX7R Neuer Benutzer

    Also das habe ich bereits probiert und ich bekomme nur alle Artikel wo ich auch Bestand habe. Die Artikel ohne Bestand werden nicht gezeigt.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    works for me:

    Code:
    test=*# create table artikel (nummer int, farbe text, breite int, name text, primary key (nummer, farbe, breite));
    CREATE TABLE
    test=*# create table bestand(nummer int, farbe text, breite int, anzahl int, foreign key(nummer,farbe,breite) references artikel);
    CREATE TABLE
    test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
     nummer | farbe | breite | name | sum
    --------+-------+--------+------+-----
    (0 rows)
    
    test=*# \d artikel
                  Table "public.artikel"
     Column |  Type   | Collation | Nullable | Default
    --------+---------+-----------+----------+---------
     nummer | integer |           | not null |
     farbe  | text    |           | not null |
     breite | integer |           | not null |
     name   | text    |           |          |
    Indexes:
        "artikel_pkey" PRIMARY KEY, btree (nummer, farbe, breite)
    Referenced by:
        TABLE "bestand" CONSTRAINT "bestand_nummer_farbe_breite_fkey" FOREIGN KEY (nummer, farbe, breite) REFERENCES artikel(nummer, farbe, breite)
    
    test=*# insert into artikel values (1, 'blau',10, 'blauer artikel');
    INSERT 0 1
    test=*# insert into artikel values (2, 'rot',20, 'roter artikel');
    INSERT 0 1
    test=*# \d bestand
                  Table "public.bestand"
     Column |  Type   | Collation | Nullable | Default
    --------+---------+-----------+----------+---------
     nummer | integer |           |          |
     farbe  | text    |           |          |
     breite | integer |           |          |
     anzahl | integer |           |          |
    Foreign-key constraints:
        "bestand_nummer_farbe_breite_fkey" FOREIGN KEY (nummer, farbe, breite) REFERENCES artikel(nummer, farbe, breite)
    
    test=*# insert into bestand values (1,'blau',10,100);
    INSERT 0 1
    test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
     nummer | farbe | breite |      name      | sum
    --------+-------+--------+----------------+-----
          2 | rot   |     20 | roter artikel  |   
          1 | blau  |     10 | blauer artikel | 100
    (2 rows)
    
    test=*# select a.nummer, a.farbe, a.breite, a.name, coalesce(sum(b.anzahl),0) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
     nummer | farbe | breite |      name      | coalesce
    --------+-------+--------+----------------+----------
          2 | rot   |     20 | roter artikel  |        0
          1 | blau  |     10 | blauer artikel |      100
    (2 rows)
    
    test=*#
    
     
  8. ukulele

    ukulele Datenbank-Guru

    Du zeigst nach wie vor nicht deinen SQL Code. Ich rate mal du hast deinen Bestand im FROM-Teil und per Join die Tabelle Artikelstamm geholt. Dann müsstest du das nur drehen, also alle Artikelstammdaten holen und per Join den Bestand dazu holen.
     
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