Abfrage Artikel Lieferant

rolandg1881

Aktiver Benutzer
Beiträge
40
Hallo!
Frage an die Profis ich steh momentan auf der Leitung!
Zuerst hoffe ich alle sind gesund!
SQL Server 2018 Abfrage:

Ich habe eine Tabelle Artikel wo hinter jedem Artikel 5 mögliche Lieferanten stehen können:

Artikel, LiefId1, LiefId2, LiefId3, LiefI4, LiefId5

Dann gibt es noch eine Lieferantentabelle mit den Infos zum Lieferanten.

Ich bräuchte jetzt eine Abfrage wo ich, wenn ich einen Lieferanten selektiere welche Artikel zu diesem Lieferanten gehören.

Hat da jemand eine Idee?
Wäre echt super!
 
Werbung:
Sorry! Mit der Info komm ich nicht weiter da bin ich zu wenig in der Materie.
Hättest du ein Beispiel?

Wegwerfen geht nicht so ist die Datenbank (ERP System).

Dankeschön!
 
Code:
test=# create table lieferanten(id int generated always as identity primary key, name text);
CREATE TABLE
test=*# create table artikel(nr int generated always as identity primary key, name text);
CREATE TABLE
test=*# create table lieferant_artikel(lieferant int references lieferanten, artikel int references artikel, primary key(lieferant, artikel));
CREATE TABLE
test=*#

Diese Tabelle kannst Du dann z.B. easy abfragen, welche Artikel ein bestimmter Lieferant Euch liefert.


Wenn der Hersteller eures ERP-Systems solch einen Müll produziert - dann werft das weg und sucht Euch einen besseren Hersteller.
 
Hi!
Danke mal für den Tipp aber ich hätte eher an eine SQL Abfrage gedacht!

Was du hier aber beschreibst ist eine Neuanlage von Tabellen ohne Inhalt?
Ich muss dort die bestehenden Datensätze importieren?

Tja, das mit einem ERP Hersteller wechseln ist nicht so einfach wenn ein Unternehmen mal ein paar hunderttausend Euro investiert hat! ;-)
Wurde vor meiner Zeit angeschafft ohne sich großartig zu informieren!

lg
 
Code:
test=*# select distinct artikel from lieferant_artikel where lieferant = 42;
 artikel
---------
(0 rows)

test=*# select distinct artikel from lieferant_artikel where lieferant = (select id from lieferanten where name = 'Radeberger');
 artikel
---------
(0 rows)

test=*#

liefert halt nix, weil nix in den Tabellen ist...
 
Hi!
Folgendes von einer Antwort von Ukulele abgeschaut:

SELECT ARTIKEL,LIEF1 AS spalte,spalte1 AS spaltenwert FROM tabelle UNION ALL
SELECT ARTIKEL,LIEF2 AS spalte,spalte2 AS spaltenwert FROM tabelle UNION ALL
SELECT ARTIKEL,LIEF3 AS spalte,spalte3 AS spaltenwert FROM tabelle UNION ALL
SELECT ARTIKEL,LIEF4 AS spalte,spalte4 AS spaltenwert FROM tabelle UNION ALL
SELECT ARTIKEL,LIEF5 AS spalte,spalte5 AS spaltenwert FROM tabelle

würde mir eine Tabelle ausgeben wo ich für den Artikel die möglichen Lieferanten sehe oder? Dann verknüpfe ich mit der Lieferantentabelle und fertisch! Oder Blödsinn?

lg
 
Nein, kein Blödsinn, aber auch nicht "fertisch"
Diese Liste enthält jeden Artikel offensichtlich 5 Mal, teilweise mit Lieferanten, eben da, wo in den Ursprungsspalten 1-5 einer drin stand.
Die Liste kannst Du so ausdrucken, Papier ist geduldig.

Wenn Du das weiter verarbeitest, kann Du damit Probleme bekommen, wenn Dir die Zusammenhänge dieser Daten oder die Nutzung von SQL und der möglichen Effekte nicht klar ist.

Mal so nebenbei: Ein ERP für >200T Euro kann keine Lieferantenliste ausgeben? Das glaube ich einfach nicht.
 
Hallo!
Danke für die Info. Die "Nullzeilen" sind natürlich nicht sauber.
Ich verarbeite die Daten mittels Qlikview weiter dort kann ich Nullwerte relativ einfach ignorieren. Vielleicht versuche ich die Abfrage vorher noch etwas zu "verfeinern". Momentan liefert sie zumindest das was ich möchte.

Das mit dem ERP ist nicht erfunden. Es gibt einfache, starre Infolisten aber keine speziellen Reports wo man in verschiedene Ebenen klicken kann.
Problem ist auch das es bei diesem (deutschen) ERP Anbieter in Österreich nur eine Vertretung für Support gibt quasi ein Monopol.

lg
 
Mmh, vielleicht ist das ja ein technischer Mangel?
Ist jedenfalls nicht sachgerecht umgesetzt, die Theorie und die Praxis zur Umsetung in relationalen Datenbanksystemen gibt es seit Jahrzehnten. Ein RDBMS basiert funktional auf diesem Verfahren. Das kann Dir jeder Fachmann bestätigen.

Man kann es auch ganz banal aus dem Alltag nehmen:
eine Einkaufsliste
Die nennt sich so, weil man die benötigten Artikel untereinander schreibt, in eine Liste (nicht in Spalten)
Die Liste kann so lang werden wie das Papier oder die Papierrolle, sie ist dennoch übersichtlich und gut nutzbar.
Listen haben die Eigenschaft, dass sie in der kulturellen Sonderform der alphabetischen Sortierung geführt werden können. (das gibt es noch länger als es RDBMS gibt)
Und das hat allseits bekannte Vorteile für die Nutzung einer Liste (nur als Beispiel)

Ich habe noch nie meine Einkäufe in Zeilen/Spalten notiert, es gibt aber vermutlich auch Leute, die das machen.

Wenn man Support (gekauft) hat, kann man meist auch Probleme eskalieren. Dabei ist man vielleicht nicht auf ein Lokalmonopol angewiesen. Kommt natürlich auf die Verträge an.
 
Hi!
Würde diese Abänderung das Problem (die Spalten mit NULL weil nicht alle Lieferanten befüllt) nicht beheben? Oder habe ich einen Logikfehler?

SELECT ART.such, ART.FK_lief AS spalte,ART.FK_lief AS spaltenwert FROM Part$Product ART
where ART.FK_LIEF <> ''
UNION ALL
SELECT ART.such, ART.FK_lief2 AS spalte,ART.FK_lief2 AS spaltenwert FROM Part$Product ART
where ART.FK_lief2 <> ''
UNION ALL
SELECT ART.such, ART.FK_lief3 AS spalte,ART.FK_lief3 AS spaltenwert FROM Part$Product ART
where ART.FK_lief3 <> ''
UNION ALL
SELECT ART.such, ART.FK_lief4 AS spalte,ART.FK_lief4 AS spaltenwert FROM Part$Product ART
where ART.FK_lief4 <> ''
UNION ALL
SELECT ART.such, ART.FK_lief5 AS spalte,ART.FK_lief5 AS spaltenwert FROM Part$Product ART
where ART.FK_lief5 <> ''
order by ART.such
 
Würde diese Abänderung das Problem (die Spalten mit NULL weil nicht alle Lieferanten befüllt) nicht beheben? Oder habe ich einen Logikfehler?

Ja, Logikfehler. NULL != ''

Code:
test=# select NULL = '';
 ?column?
----------
(1 row)

test=*# select NULL != '';
 ?column?
----------
(1 row)

test=*# select NULL <> '';
 ?column?
----------
(1 row)

Aber:

Code:
test=*# select (select NULL) is NULL;
 ?column?
----------
 t
(1 row)
 
Werbung:
Hallo zusammen,

dass die vorliegende Quelle nicht sehr geschickt aufgebaut ist, steht außer Frage.
Um jetzt aber mit dem arbeiten zu können, was hier vorliegt, gibt es im SQL Server die UNPIVOT-Funktion.

Ich hab da mal ein Beispiel gemacht und hoffe, dass es hilft:

Code:
IF OBJECT_ID('TempDB..#pvt') IS NOT NULL DROp TABLE #pvt
CREATE TABLE #pvt
(
    ArtikelID INT,
    Artikel varchar(255),
    Lief1 varchar(255),
    Lief2 varchar(255), 
    Lief3 varchar(255),
    Lief4 varchar(255),
    Lief5 varchar(255)
); 

INSERT INTO #pvt VALUES (1,'Artikel 1', 'Lieferant 4','Lieferant 5', NULL, NULL, NULL); 
INSERT INTO #pvt VALUES (2,'Artikel 2', 'Lieferant 1','Lieferant 5', NULL, NULL, NULL);
INSERT INTO #pvt VALUES (3,'Artikel 3', 'Lieferant 2','Lieferant 3', NULL, 'Lieferant 4', NULL);
INSERT INTO #pvt VALUES (4,'Artikel 4', 'Lieferant 4','Lieferant 5', NULL, NULL, NULL);
INSERT INTO #pvt VALUES (5,'Artikel 5', 'Lieferant 1','Lieferant 5', NULL, NULL, NULL);
INSERT INTO #pvt VALUES (6,'Artikel 6', 'Lieferant 4','Lieferant 3', NULL, NULL, 'Lieferant 1'); 

-- Vorliegende Tabelle
SELECT * FROM #pvt

-- UNPIVOT
SELECT ArtikelID,  Artikel, Lieferant
FROM   
   (SELECT ArtikelID, Artikel, Lief1, Lief2, Lief3, Lief4, Lief5 
   FROM #pvt) p 
UNPIVOT 
   (Lieferant FOR Lief IN   
      (Lief1, Lief2, Lief3, Lief4, Lief5  ) 
)AS unpvt;

Mehr Info von Microsoft gibt es auf dieser Seite: Verwenden von PIVOT und UNPIVOT - SQL Server

In meinem Beispiel habe ich zuerst eine temporäre Tabelle gebaut, um überhaupt Daten in meinem Beispiel auswerten zu können.
Die eigentliche Lösung ist der Bereich "UNPIVOT"
Das muss man jetzt nur noch auf die wirklich vorliegenden Spalten der Quelle anpassen.

Viele Grüße,
Tommi
 
Zurück
Oben