Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Filtern- Wenn vorhanden dann den, sonst einen anderen Datensatz

Frage Entwicklung Datenbanken

Mitglied: Maik87

Maik87 (Level 2) - Jetzt verbinden

30.01.2013 um 12:41 Uhr, 1766 Aufrufe, 9 Kommentare

Hallo,

sorry für die blöde Überschrift, mir fiel jedoch nichts besseres ein ;)

Nehmen wir mal an, ich habe eine einfache Tabelle:

Artikelnummer - Lagerort
1 - 1
2 - 1
3 - 1
3 - 2
4 - 2

Ich benötige nun eine Abfrage, die jede Artikelnummer nur einmal ausgibt und in den zweiten Spalte den Lagerort. Ist der Artikel an Lagerort 1 verfügbar, dann möchte ich, dass dieser Datensatz ausgegeben wird, sonst der des anderen Lagerortes.

Also so:
1 - 1
2 - 1
3 - 1
4 - 2

Geht das in einer gemeinsamen Abfrage oder muss ich zwei mit UNION zusammenführen?

SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1
UNION
SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Artikelnummer NOT IN (SELECT Artikelnummer, Lagerort FROM ArtLager WHERE Lagerort = 1);
Mitglied: nxclass
30.01.2013 um 12:44 Uhr
Hi, man könnte ja einfach nach Artikelnummer Gruppieren.
Bitte warten ..
Mitglied: Maik87
30.01.2013 um 12:46 Uhr
Woher ist dann sichergestellt, dass bevorzugt Lagerort 1 kommt?
Bitte warten ..
Mitglied: nxclass
30.01.2013, aktualisiert um 12:51 Uhr
Woher ist dann sichergestellt, dass bevorzugt Lagerort 1 kommt?
eigentlich gar nicht - die meisten DB Systeme nutzen dann den "ersten" gefundenen Wert.
ABER: es gibt natürlich die Möglichkeiten wie zB die Aggregat Funktionen, welche das regeln können - das kommt dann aber auf dein DB System an.
Das einfachste wäre natürlich ein MIN() zu nutzen.

01.
SELECT Artikelnummer, MIN(Lagerplatz) 
02.
... 
03.
GROUP BY Artikelnummer
Bitte warten ..
Mitglied: Maik87
30.01.2013, aktualisiert um 13:04 Uhr
> Woher ist dann sichergestellt, dass bevorzugt Lagerort 1 kommt?
eigentlich gar nicht - die meisten DB Systeme nutzen dann den "ersten" gefundenen Wert.

Da ist das Problem

ABER: es gibt natürlich die Möglichkeiten wie zB die Aggregat Funktionen, welche das regeln können - das kommt dann
aber auf dein DB System an.
Das einfachste wäre natürlich ein MIN() zu nutzen.

Leider in dem Fall nicht. Es ist ein vereinfachtes Beispiel. Produktiv muss ich es umsetzen können auf Strings, leere Felder etc. Aggregat Funktionen scheiden daher leider aus.
Bitte warten ..
Mitglied: LianenSchwinger
30.01.2013 um 13:14 Uhr
... dann gib doch mal ein paar mehr Angaben. Wir sind ja Willens zu helfen.

- Datenbanksystem
- konkrete Lagerortbezeichnungen
- Rangfolge der Lagerorte

Gruß Jörg
Bitte warten ..
Mitglied: Maik87
30.01.2013 um 13:40 Uhr
Es läuft eine MySQL-Datenbank Version 5.5.29

Die Lagerorte waren nur ein Beispiel.

Die Tabelle kann auch so aussehen:

Artikelnummer - Lagerort
1 - Berlin
2 - Berlin
3 - Berlin
3 - Hamburg
4 - Hamburg

Nun gibt es auch Tabellen

Abteilung - Name - Vertreter - Frei
EDV - Meyer - - X
EDV - Schulz - X - X
Einkauf - Müller - -
Einkauf - Henrichs - X - X

Hier möchte ich von jeder Abteilung eine Person haben, die frei ist. Zunächst der "nicht-Vertreter". Hat dieser keine Zeit, dann der Vertreter.

Ich könnte noch eine Menge Beispiele kreieren.

Kann ich mit MIN und MAX auch auf alphabetische Reihenfolgen zugreifen?
Bitte warten ..
Mitglied: LianenSchwinger
30.01.2013, aktualisiert um 15:07 Uhr
Gibt es in Beispiel 1 nur Berlin und Hamburg? Dann geht MIN(), da Berlin < Hamburg ist.

Beispiel 2 könnte z.B. so klappen.

01.
SELECT a.abteilung AS Abteilung, 
02.
       IFNULL(SUBSTRING_INDEX(GROUP_CONCAT(a.name ORDER BY a.vertreter SEPARATOR '*'),'*', 1), 
03.
              'keiner frei') AS Name 
04.
FROM (SELECT DISTINCT b.abteilung FROM xy_tabelle b) AS c 
05.
LEFT JOIN xy_tabelle AS a USING(abteilung) 
06.
WHERE a.frei IS NOT NULL 
07.
GROUP BY a.abteilung
Gruß Jörg
Bitte warten ..
Mitglied: LianenSchwinger
30.01.2013, aktualisiert um 14:58 Uhr
Beispiel 2 müsste auch so gehen

01.
SELECT x.abteilung, 
02.
       IFNULL(IFNULL(y.name,z.name),'keiner frei') Name 
03.
FROM (SELECT DISTINCT a.abteilung  
04.
      FROM xy_tabelle a) AS x 
05.
LEFT JOIN (SELECT b.abteilung, b.name  
06.
           FROM xy_tabelle AS b  
07.
           WHERE b.vertreter IS NULL AND b.frei IS NOT NULL) AS y USING(abteilung) 
08.
LEFT JOIN (SELECT c.abteilung, c.name  
09.
           FROM xy_tabelle AS c  
10.
           WHERE b.vertreter IS NOT NULL AND b.frei IS NOT NULL) AS z USING(abteilung)
Halt ohne Aggregat-Funktion.

Gruß Jörg
Bitte warten ..
Mitglied: nxclass
31.01.2013 um 13:01 Uhr
Kann ich mit MIN und MAX auch auf alphabetische Reihenfolgen zugreifen?
nicht sinnvoll

Dann lege dir doch eine Tabelle an mit Lagerort und Entfernung bzw Priorität. Nun kannst du mit GROUP und MAX(priorität) arbeiten.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...