Knifflige SQL Abfrage
Hallo zusammen
Habe folgende Anfängerproblem. Mir stehen folgende Informationen zur Verfügung (Beispiel):
Artikel /Lagerort / Menge
Artikel A / Lagerort1 / 100
Artikel A / Lagerort2 / 10
Artikel B / Lagerort1 / 99
Artikel B / Lagerort2 / 101
Artikel B / Lagerort3 / 3
Ich muss als Schlussrestultat pro Artikel eine einzige Zeile ausgeben (Beispiel):
Artikel /Menge Lagerort1 / Menge Lagerort2 / Menge Lagerort3
Artikel A / 100 / 10 / 0
Artikel B / 99 / 101 / 3
Gibt es eine Möglichkeit, dies in einem einzigen View zu erreichen?
Für sämtliche Anregungen danke ich euch bereits an dieser Stelle recht herzlich!
Stephan Desoleure
Habe folgende Anfängerproblem. Mir stehen folgende Informationen zur Verfügung (Beispiel):
Artikel /Lagerort / Menge
Artikel A / Lagerort1 / 100
Artikel A / Lagerort2 / 10
Artikel B / Lagerort1 / 99
Artikel B / Lagerort2 / 101
Artikel B / Lagerort3 / 3
Ich muss als Schlussrestultat pro Artikel eine einzige Zeile ausgeben (Beispiel):
Artikel /Menge Lagerort1 / Menge Lagerort2 / Menge Lagerort3
Artikel A / 100 / 10 / 0
Artikel B / 99 / 101 / 3
Gibt es eine Möglichkeit, dies in einem einzigen View zu erreichen?
Für sämtliche Anregungen danke ich euch bereits an dieser Stelle recht herzlich!
Stephan Desoleure
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 70124
Url: https://administrator.de/forum/knifflige-sql-abfrage-70124.html
Ausgedruckt am: 23.12.2024 um 17:12 Uhr
5 Kommentare
Neuester Kommentar
Wenn du zwei Tabellen machst mit den Spalten Artikel und Menge, eine für Lagerort1 udn eine für Lagerort2, und dann die Artikelbezeichnung eindeutig hältst, geht das. Ich mache das mal in MySQL-Syntax, vor MS-SQL habe ich mich bisher gedrückt:
CREATE TABLE `Lagerort1` (
`Artikel` TINYTEXT,
`Menge` INT(11)
);
CREATE TABLE `Lagerort2` (
`Artikel` TINYTEXT,
`Menge` INT(11)
);
Wenn du dann deine Daten reinpackst, z.B.:
INSERT INTO `Lagerort1` (`Artikel`, `Menge`) VALUES ('Artikel A', 10);
INSERT INTO `Lagerort2` (`Artikel`, `Menge`) VALUES ('Artikel A', 100);
... kannst du mit einer einzigen Abfrage das Ganze zusammenführen:
SELECT `Lagerort1`.`Artikel`, `Lagerort1`.`Menge`, `Lagerort2`.`Menge` FROM `Lagerort1`, `Lagerort2` WHERE `Lagerort1`.`Artikel`='Artikel A' AND `Lagerort2`.`Artikel`='Artikel A' LIMIT 1
Dabei habe ich so weit wie möglich auf den Einsatz von MySQL-Automatismen verzichtet und alles per Queries geregelt, ist natürlich nur eine von vielen Möglichkeiten.
-nik
CREATE TABLE `Lagerort1` (
`Artikel` TINYTEXT,
`Menge` INT(11)
);
CREATE TABLE `Lagerort2` (
`Artikel` TINYTEXT,
`Menge` INT(11)
);
Wenn du dann deine Daten reinpackst, z.B.:
INSERT INTO `Lagerort1` (`Artikel`, `Menge`) VALUES ('Artikel A', 10);
INSERT INTO `Lagerort2` (`Artikel`, `Menge`) VALUES ('Artikel A', 100);
... kannst du mit einer einzigen Abfrage das Ganze zusammenführen:
SELECT `Lagerort1`.`Artikel`, `Lagerort1`.`Menge`, `Lagerort2`.`Menge` FROM `Lagerort1`, `Lagerort2` WHERE `Lagerort1`.`Artikel`='Artikel A' AND `Lagerort2`.`Artikel`='Artikel A' LIMIT 1
Dabei habe ich so weit wie möglich auf den Einsatz von MySQL-Automatismen verzichtet und alles per Queries geregelt, ist natürlich nur eine von vielen Möglichkeiten.
-nik
Moin desoleure,
Etwas abstrakt würde eine mögliche Lösung so aussehen können:
... mehr lässt ich sich nicht sagen, wenn weder Tabellennamen (relativ egal) noch Datenbank-Blech (ganz entscheidend) bekannt/benannt sind.
Bitte etwas konkreter posten.
Grüße
Biber
P.S. Ich verschiebe den Beitrag von "Internet & Intranet\Domain-Registrierung" nach "Datenbanken".
Etwas abstrakt würde eine mögliche Lösung so aussehen können:
Select artikel, Menge as Lagerort1, 0 as Lagerort2, 0 as Lagerort3
from ArtikelEingelagert where Lagerort ="Lagerort1"
UNION
Select artikel, 0 as Lagerort1, Menge as Lagerort2, 0 as Lagerort3
from ArtikelEingelagert where Lagerort ="Lagerort2"
UNION
Select artikel, 0 as Lagerort1, 0 as Lagerort2, Menge as Lagerort3
from ArtikelEingelagert where Lagerort ="Lagerort3"
Group by artikel
... mehr lässt ich sich nicht sagen, wenn weder Tabellennamen (relativ egal) noch Datenbank-Blech (ganz entscheidend) bekannt/benannt sind.
Bitte etwas konkreter posten.
Grüße
Biber
P.S. Ich verschiebe den Beitrag von "Internet & Intranet\Domain-Registrierung" nach "Datenbanken".
Gibt es, wird aber komplex.
Bsp:
SELECT DISTINCT TLager.Artikel, Tlager1.Menge_Lager1, Tlager2.Menge_Lager2, Tlager3.Menge_Lager3
FROM TLager,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager1
FROM TLager
WHERE TLager.Lager="L1") AS TLager1,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager2
FROM TLager
WHERE TLager.Lager="L2") AS TLager2,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager3
FROM TLager
WHERE TLager.Lager="L3") AS TLager3
where tlager.artikel=tlager1.artikel and tlager.artikel=tlager2.artikel and tlager.artikel=tlager3.artikel
Habe die Tabelle TLager genannt und die Lagerorte L1 bis L3.
Momentan macht diese View aber einen Inner Join, zeigt also nur die an, wo es für alle 3 Lagerorte Einträge gibt.
Prinzipiell müsste man Left Outer Joins auf die TLager machen, aber das bastle ich nicht zusammen.
Damits übersichtlicher wird, würde ich vorschlagen:
3 Views die jeweils einen Lagerort ausgeben und die dann in einer 4. View zusammenfassen.
Bsp:
SELECT DISTINCT TLager.Artikel, Tlager1.Menge_Lager1, Tlager2.Menge_Lager2, Tlager3.Menge_Lager3
FROM TLager,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager1
FROM TLager
WHERE TLager.Lager="L1") AS TLager1,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager2
FROM TLager
WHERE TLager.Lager="L2") AS TLager2,
(SELECT TLager.Artikel, TLager.Menge as Menge_Lager3
FROM TLager
WHERE TLager.Lager="L3") AS TLager3
where tlager.artikel=tlager1.artikel and tlager.artikel=tlager2.artikel and tlager.artikel=tlager3.artikel
Habe die Tabelle TLager genannt und die Lagerorte L1 bis L3.
Momentan macht diese View aber einen Inner Join, zeigt also nur die an, wo es für alle 3 Lagerorte Einträge gibt.
Prinzipiell müsste man Left Outer Joins auf die TLager machen, aber das bastle ich nicht zusammen.
Damits übersichtlicher wird, würde ich vorschlagen:
3 Views die jeweils einen Lagerort ausgeben und die dann in einer 4. View zusammenfassen.