mist
Goto Top

SQL - FRAGE

Guten Morgen,

ich habe ein ein SQL-Script, welches mir eine Liste aufzeigt.
SELECT artikel
   , menge
   , ort
FROM lager

Jetzt ist es so, dass es Artikel doppelt gibt und die Ausgabe 2 Zeigen zeigt.
Jetzt möchte ich gerne, dass nur eine Zeile angezeigt wird.
Hier ein Beispiel:
IST:
[artikel] [menge] [ort    ]
[kulli  ] [23   ] [lager_1]
[kulli  ] [45   ] [lager_2]
SOLL:
[artikel] [menge] [ort    ] [menge] [ort    ]
[kulli  ] [23   ] [lager_1] [45   ] [lager_2]

Wer hätte eine Idee, wie ich das umsetzten kann?

Ich bin für jeden Tipp dankbar.
Gruß Michael

Content-Key: 397713

Url: https://administrator.de/contentid/397713

Printed on: April 19, 2024 at 08:04 o'clock

Member: sabines
sabines Jan 10, 2019 at 05:57:53 (UTC)
Goto Top
Moin,

group by oder distinct sollten dafür ausreichen.

Gruss
Member: Volchy
Volchy Jan 10, 2019 at 06:22:48 (UTC)
Goto Top
Moin, group by & distinct funktionieren für dich so in der Form alleine nicht, wenn du deine Ausgabe so belassen willst, da für die DB Menge & Ort 2 verschiedene Datensätze sind.

Gibt es denn noch mehr als nur doppelte Einträge?
Mein erster Gedanke wäre gewesen, dass du über Row_Number Funktion arbeiten könntest und mit Union dir die entsprechenden Columns dann befüllst.
Aber es ist auch noch sehr früh am Morgen :-P
Member: MiSt
MiSt Jan 10, 2019 updated at 06:38:19 (UTC)
Goto Top
Moin,

GROUP BY und DISTINCT hätte mich auch gewundert, da ich ja die anderen Werte brauche.
Eigentlich gibt es immer nur 2 Orte. Einen, der immer gleich heisst - "VK-Lager" und einen (pro Artikel) der sich ändert. Dieser Ort hat am Anfang aber immer die gleichen Ziffern/Buchstaben erst nach x zeichen ändern sich die Ziffern --> z.B.: lager1_0234, lager1_2646, lager1_2645

Da ich aber kein SQL-Profi bin, bin ich aktuell mit deinem Gedanken überfordert.
Member: erikro
erikro Jan 10, 2019 at 08:09:40 (UTC)
Goto Top
Moin,

das sollte mit einer Pivot-Table gehe. Guckst Du hier:

https://modern-sql.com/de/anwendung/pivot

hth

Erik
Member: Volchy
Volchy Jan 10, 2019 at 08:15:42 (UTC)
Goto Top
Wenn es VK-Lager zu jedem Artikel immer gibt, könntest du den einfach fest in der Spalte mit angeben, wie bspw.:
select artikel, 'VK-Lager', max(ort)
from Tabelle
where ort <> 'VK-Lager'
group by artikel

--> max() hierbei als Aggregatfunktion, da diese Spalte nicht in Group-By angegeben ist --> Sonst gibt es eine Fehlermeldung von Server
Member: TheJoker2305
TheJoker2305 Jan 10, 2019 at 08:58:48 (UTC)
Goto Top
Hallo Michael,

folgender Code sollte dir dein Ergebnis bringen, solange nicht mehr als das lager_1 und lager_2 existieren.
Eine Lösung dann wäre eine Common Table Expression oder ein weiteres Select um die gesamte Abfrage.

select 
	artikel,
	sum(case when ort = 'lager_1' then menge else 0 end) as menge_1,  
	case when ort = 'lager_1' then 'ort_1' else '' end as ort_1,  
	sum(case when ort != 'lager_1' then menge else 0 end) as menge_2,  
	case when ort != 'lager_1' then ort else '' end as ort_2  
from 
	lager
group by
	artikel, ort_1, ort_2
order by 
	artikel, ort_1, ort_2



Gruß
thejoker2305
Member: MiSt
MiSt Jan 10, 2019 updated at 09:29:46 (UTC)
Goto Top
Ich glaube, dass ich euch das Beispiel nicht richtig aufgezeigt habe. Sorry, mein Fehler... Oder ich habs nicht verstanden... : )
[artikel] [menge] [ort     ]
[kulli  ] [23   ] [vk-lager]
[kulli  ] [45   ] [lager_34]
[stift  ] [0    ] [vk-lager]
[stift  ] [56   ] [lager_65]
[artikel] [menge] [ort     ] [menge] [ort     ]
[kulli  ] [23   ] [vk-lager] [45   ] [lager_34]
[stift  ] [0    ] [vk-lager] [56   ] [lager_65]
Der 2. Lagerort "lager_##" ist dynamisch. "vk-lager" gibt es immer.
Member: TheJoker2305
TheJoker2305 Jan 10, 2019 updated at 12:11:10 (UTC)
Goto Top
Dann so:

select 
	artikel,
	sum(case when ort = 'vk_lager' then menge else 0 end) as menge_lager_vk,  
	case when ort = 'vk_lager' then 'ort_1' else '' end as ort_1,  
	sum(case when ort like 'lager_%' then menge else 0 end) as menge_lager_x,  
	case when ort like 'lager_%' then then ort else '' end as ort_2  
from 
	lager
group by
	artikel, ort_1, ort_2
order by 
	artikel, ort_1, ort_2
Member: MadMax
MadMax Jan 10, 2019 at 14:04:36 (UTC)
Goto Top
Hallo Michael,

wenn es je Artikel nur maximal zwei Lager gibt und einer immer 'vk-lager' heißt, würde ich das mit einem ganz billigen join lösen:
select	vk.artikel,
	vk.menge,
	vk.ort,
	l2.menge,
	l2.ort
from	lager vk
	left join lager l2 on l2.artikel = vk.artikel and l2.ort <> vk.ort
where	vk.ort = 'vk-lager'  

Gruß, Mad Max
Member: ukulele-7
ukulele-7 Jan 10, 2019 at 15:15:10 (UTC)
Goto Top
Es gibt eine ganze Menge Lösungen für das Problem, PIVOT, FOR XML PATH, CASE oder JOIN. Nach allem was ich gelesen habe würde ich auch den join von MadMax wählen. Du könntest den LEFT JOIN noch gegen einen FULL OUTTER JOIN tauschen, dann siehst du auch Artiel die keinen VK Lager Eintrag haben, sollte es den Fall geben. Oder gibt es dann einen Datensatz mit Stückzahl 0?

Wenn du sagst das es "eigentlich" immer nur zwei Einträge gibt dann solltest du dir Gedanken machen ob es auch uneigentlich mal drei geben kann. Das könnte man Abfangen, je nachdem ob es ein Problem werden könnte wenn dann mehrere Zeilen erscheinen.
Member: MiSt
MiSt Jan 10, 2019 at 15:39:51 (UTC)
Goto Top
Hi,
ich werde das morgen mal testen.
Ja, es wird immer 2 Lager pro Artikel geben. Das "VK-Lager" ist immer gleich, bei allen Artikeln ist das "VK-Lager". Beim anderen Lager gibt es auch immer nur ein Lager. Das ist nur pro Artikel ein anderes.

VG