gerber
Goto Top

Hilfe bei Datenbank View

Hallo zusammen,

ich habe an die Datenbank Profis eine kurze Frage, ob so etwas überhaupt denkbar und möglich ist.

Folgendes Szenario:

ich habe drei Tabellen in einer MySQL Datenbank:

1. tAuftrag
2. tArtikel
3. tLocation
4. tauftragartikel


In der tAuftrag habe ich z.B.:

auftragsnr | status | kundennr

tArtikel:

artikelnr | artikel| beschreibung

tLocation:

locationnr | name | plz |

tAuftragartikel:

ID | auftragsnr | artikelnr | menge


Nun möchte ich in einer View gerne eine Ausgabe haben, dass in einer Zeile der Auftrag + die Artikel zum Auftrag ausgegeben werden.

Hier gilt es zu sagen, dass Maximal 4 Artikel je Auftrag möglich sein können.

Wenn ich es nun z.B. so Abfrage:

select 
  `tauftrag`.`auftragsnr2` AS `auftragsnr2`,
  `tauftrag`.`leistungsdatum` AS `leistungsdatum`,
  `tauftrag`.`full` AS `full`,
  `tartikel`.`artikel` AS `artikel`,
 
from (((`tauftrag` 
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr` = `tauftragartikel`.`auftragsnr`)) 
  join `tartikel` on
    (`tauftragartikel`.`artikelnr` = `tartikel`.`artikelnr`)) 
  join `tlocation` on
    (`tauftrag`.`locationnr` = `tlocation`.`locationnr`))


Bekomme ich natürlich z.B. zwei Zeilen, wenn der Kunde zwei Artikel in der Tabelle "tAuftragartikel" hat (Siehe Anhang):

1111


Jetzt die Frage ist es möglich, dass ich die View so aufbaue:

auftragsnr2 | leistungsdatum | full | artikel 1 | aritkel 2 | artikel 3 | artikel4

Und somit falls es mehrere Artikel in der Tabelle gibt, diese in einer Zeile dargestellt werden?


Ich hoffe es war irgendwie verständlich erklärt...

Danke euch für die Hilfe.

Grüße
Phil

Content-ID: 1212900080

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

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

ukulele-7
ukulele-7 31.08.2021 um 08:44:49 Uhr
Goto Top
Du suchst PIVOT, welches SQL nutzt du?
Gerber
Gerber 31.08.2021 aktualisiert um 08:54:22 Uhr
Goto Top
Hey,

Danke dir für die Antwort.

MySQL, sry für die fehlende Info.

Hast du hierfür ein Beispiel oder kannst mir weiterhelfen? Ich habe noch nie mit PIVOT gearbeitet. 🙄
ukulele-7
ukulele-7 31.08.2021 aktualisiert um 09:04:22 Uhr
Goto Top
PIVOT und ich wir werden wohl keine Freunde face-smile jedenfalls vertue ich mich da immer. Ist aber ansich nicht so kompliziert. Die Ausgangstabelle hast du eigentlich schon mit deinem Select. Hier mal ein Beispiel:
https://codingsight.com/pivot-tables-in-mysql/
StefanKittel
StefanKittel 31.08.2021 um 09:10:11 Uhr
Goto Top
Moin,
rein mit MySQL wird das zumindest fummelig.
Wenn Du eine Anwendungssprache wie PHP oder Java verwenden würdest wäre das kein Problem,

Und zur Prinzipfrage: Was machst Du wenn ein Auftrag 500 Artikel hat? Auch brauchst Du ja pro Artikel noch die Anzahl, Preis, etc...

Stefan
Gerber
Gerber 31.08.2021 um 09:10:36 Uhr
Goto Top
😋Alles klar, danke dir.

Dann werde ich mich später einmal rantasten und schauen ob ich irgendwie zum Ziel komme 😅😅
Gerber
Gerber 31.08.2021 aktualisiert um 09:12:57 Uhr
Goto Top
@StefanKittel:

Danke dir für die Antwort.

Ich arbeite dann mit PHP und Javascript. Aber im PHP greife ich eben auf die Views zu.

Und zur Prinzipfrage: Was machst Du wenn ein Auftrag 500 Artikel hat? Auch brauchst Du ja pro Artikel noch die Anzahl, Preis, etc...

Wie oben geschrieben kommt das zu 100 Prozent nicht vor.
Es sind immer Maximal 4 Artikel möglich mehr nicht.

Ich will auch keinen Preis und keine Menge.
Ich will lediglich die Artikel (Beschreibung) zum Auftrag wissen, mehr nicht 👍


Sonst würde ich den Weg nicht gehen.
ukulele-7
ukulele-7 31.08.2021 um 09:15:25 Uhr
Goto Top
Ja PIVOT macht nur Sinn wenn eine feste und nicht sehr hohe Anzahl an Datensätzen betroffen ist, 4 ist kein Problem.

Alternative kannst du mit group_concat() oder wie das bei MySQL heißt alles in eine Zeile pappen.
Gerber
Gerber 31.08.2021 um 10:02:54 Uhr
Goto Top
Ja PIVOT macht nur Sinn wenn eine feste und nicht sehr hohe Anzahl an Datensätzen betroffen ist, 4 ist kein Problem.

muss ich mir später einmal ansehen 👍

Alternative kannst du mit group_concat() oder wie das bei MySQL heißt alles in eine Zeile pappen.

Hier habe ich allerdings das Problem, dass ich dann nicht Artikel 1 | Artikel 2 mit der Grouped by Funktion ausgeben kann.

Hätte ich jetzt eine Tabelle mit z.B. Mengenangaben, dann funktioniert die Gruppierung natürlich tip top.
Außer es gibt auch hier eine Funktion, welche ich nicht kenne.
LordGurke
LordGurke 31.08.2021 um 10:08:03 Uhr
Goto Top
Eventuell funktioniert das, wenn du die Artikel mit einem Subselect holst und mit CONCAT zusammenfassen lässt.
Anstelle von JOIN kann man ja auch Subselects verwenden.
Gerber
Gerber 31.08.2021 um 10:50:45 Uhr
Goto Top
Puuh, also irgendwie komme ich mit beidem nicht so richtig ans Ziel 🙄😅
ukulele-7
ukulele-7 31.08.2021 aktualisiert um 13:39:31 Uhr
Goto Top
Vielleicht ist es auch einfacher passend zu joinen. Sind die 4 Artikel immer gleich oder in welchem Zusammenhang stehen die? Ich muss ja irgendwie eine Zuordnung zur Spalte vorgeben. Gibt es da eine sinnvolle Sortierung? Ich glaube MySQL unterstützt mittlerweile ROW_NUMBER() und CTE. Guck mal ob bei dir
WITH t1 AS (
select 
ROW_NUMBER() OVER (PARTITION BY `tauftrag`.`auftragsnr2` ORDER BY `tartikel`.`leistungsdatum`,`tartikel`.`artikel`) AS zeile,
  `tauftrag`.`auftragsnr2` AS `auftragsnr2`,
  `tauftrag`.`leistungsdatum` AS `leistungsdatum`,
  `tauftrag`.`full` AS `full`,
  `tartikel`.`artikel` AS `artikel`,
 
from (((`tauftrag` 
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr` = `tauftragartikel`.`auftragsnr`)) 
  join `tartikel` on
    (`tauftragartikel`.`artikelnr` = `tartikel`.`artikelnr`)) 
  join `tlocation` on
    (`tauftrag`.`locationnr` = `tlocation`.`locationnr`))
)
SELECT t1.*,t2.`artikel`,t3.`artikel`,t4.`artikel`
FROM t1
LEFT JOIN t1 t2
ON t1.`auftragsnr2` = t2.`auftragsnr2`
AND t2.zeile = 2
LEFT JOIN t1 t3
ON t1.`auftragsnr2` = t3.`auftragsnr2`
AND t3.zeile = 3
LEFT JOIN t1 t4
ON t1.`auftragsnr2` = t4.`auftragsnr2`
AND t4.zeile = 4
WHERE t1.zeile = 1
Gerber
Gerber 31.08.2021 aktualisiert um 14:02:17 Uhr
Goto Top
Danke dir für die Hilfe....

Puuh, krasse Abfrage 😅.

Sind die 4 Artikel immer gleich oder in welchem Zusammenhang stehen die?

Die Artikel werden in der Tabelle tArtikel angelegt.

z.B.
artikelnr | Name | Beschreibung

Dann gibt es eben die Hilfstabelle, um die Benötigten Artikel (maximal 4 aus der tArtikel) einem Auftrag zuzuordnen.

tauftragartikel:

id | auftragsnr | artikelnr | ..


Der Code von dir wirft leider Fehler aus.
ukulele-7
ukulele-7 31.08.2021 um 14:05:30 Uhr
Goto Top
Zitat von @Gerber:

Dann gibt es eben die Hilfstabelle, um die Benötigten Artikel (maximal 4 aus der tArtikel) einem Auftrag zuzuordnen.
Ich meinte gibt es eine Information wie z.B. Artikel 1,2,3 oder 4 oder gibt es einfach nur 4 Einträge, Reihenfolge egal?
Zitat von @Gerber:

Der Code von dir wirft leider Fehler aus.
Ich weiß MySQL kann das nicht gut aber Fehlermeldung?

Funktioniert nur der Teil Zeile 2 bis 15?
Gerber
Gerber 31.08.2021 aktualisiert um 14:20:48 Uhr
Goto Top
Ich meinte gibt es eine Information wie z.B. Artikel 1,2,3 oder 4 oder gibt es einfach nur 4 Einträge, Reihenfolge egal?

In der Regel hat ein Auftrag immer nur zwei Artikel zugewiesen.
Diese Reihenfolge ist meist gleich "Artikel 1 ist eine Artikel, welcher in der Beschreibung etwas mit Box beinhaltet" und Artikel 2 " etwas mit Layout.

kann aber natürlich auch sein, dass die Reihenfolge sich ändert.

Die Reihenfolge wie es in der View angezeigt werden soll, ist völlig egal.

Wichtig ist einfach nur, dass die Artikel 1-4 in einem Datensatz stehen.

Folgender Fehler:

SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from (((`tauftrag`   
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr...' at line 10  

Hier habe ich jetzt nur 2-15 angegeben.
MadMax
MadMax 31.08.2021 um 20:40:31 Uhr
Goto Top
Hallo Phil,

versuche mal:
select	a.auftragsnr, a.leistungsdatum, a.kundennr, l.name, l.plz,
	max (case p.position when 1 then ar.artikel end) as artikel1,
	max (case p.position when 2 then ar.artikel end) as artikel2,
	max (case p.position when 3 then ar.artikel end) as artikel3,
	max (case p.position when 4 then ar.artikel end) as artikel4
from	tAuftrag a
	join (select row_number () over w as position, * from tAuftragartikel window w as (partition by auftragsnr order by ID)) p on p.auftragsnr = a.auftragsnr
	join tArtikel ar on ar.artikelnr = p.artikelnr
	join tLocation l on l.locationnr = a.locationnr
group by a.auftragsnr, a.leistungsdatum, a.kundennr, l.name, l.plz

Das mit den Tabellenalias und ohne die Hochkomma überall sollte MySQL auch verstehen.

Schwachpunkt ist natürlich die Unterabfrage mit dem row_number drin, wenn das der Optimizer nicht ordentlich löst, dann kannst Du da ein Zeitproblem kriegen. Um das zu umgehen bräuchtet Ihr eine Positionsnummer bei den Auftragartikeln (gleiches Problem wie oben bei ukulele, da heißt das zeile).

Gruß, Mad Max
StefanKittel
StefanKittel 31.08.2021 um 23:48:48 Uhr
Goto Top
Zitat von @Gerber:
@StefanKittel:
Danke dir für die Antwort.
Ich arbeite dann mit PHP und Javascript. Aber im PHP greife ich eben auf die Views zu.

Ne "einfacher" aber weniger elegant.

Hole Recordset mit Aufträgen ohne Artikel
For Each mit Recordset
{
  $ArtitelText = "";  
  Hole Recordset mit Artikel für diesen einen Auftrag
  For Each mit Recordset
  {
    $ArtitelText .= $row['ArtikelName'] . ", ";  
  }

  Ausgabe dieses Auftrages mit dem String $ArtitelText

}
Gerber
Gerber 01.09.2021 um 08:03:52 Uhr
Goto Top
@MadMax:

Danke dir.

Leider will auch der Code nicht.
ich denke ich werde jetzt einmal zwei neue Tabellen aufbauen und eine Pivot View erstellen.

Damit ich einmal das Prinzip komplett verstanden habe.

Schwachpunkt ist natürlich die Unterabfrage mit dem row_number drin, wenn das der Optimizer nicht ordentlich löst, dann kannst Du da ein Zeitproblem kriegen. Um das zu umgehen bräuchtet Ihr eine Positionsnummer bei den Auftragartikeln (gleiches Problem wie oben bei ukulele, da heißt das zeile).


Verstehe...

Ne "einfacher" aber weniger elegant.

Yes. Glaube ich dir.
Würde es aber gerne über eine View verstehen und abbilden...
ukulele-7
ukulele-7 01.09.2021 um 10:40:24 Uhr
Goto Top
Vor allem nutzt du MariaDB, nicht MySQL. Auch wenn die sich ähnlich sind sollte man da genau sein. MariaDB unterstützt ROW_NUMBER() ab Version 10.2:
https://mariadb.com/kb/en/row_number/#:~:text=ROW_NUMBER%20%28%29%20was% ....

Ich habe deinen Code genommen und nur um ROW_NUMBER() ergänzt, deinen Code aber nicht geprüft. Der Fehler steckt aber genau da, was die Fehlermeldung auch sagt: Zeile 7 ist die letzte Zeile des Selects und schließt mit einem Komma ab, dann kommt FROM. Das ist natürlich falsch
WITH t1 AS (
select 
ROW_NUMBER() OVER (PARTITION BY `tauftrag`.`auftragsnr2` ORDER BY `tartikel`.`leistungsdatum`,`tartikel`.`artikel`) AS zeile,
  `tauftrag`.`auftragsnr2` AS `auftragsnr2`,
  `tauftrag`.`leistungsdatum` AS `leistungsdatum`,
  `tauftrag`.`full` AS `full`,
  `tartikel`.`artikel` AS `artikel`
 
from (((`tauftrag` 
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr` = `tauftragartikel`.`auftragsnr`)) 
  join `tartikel` on
    (`tauftragartikel`.`artikelnr` = `tartikel`.`artikelnr`)) 
  join `tlocation` on
    (`tauftrag`.`locationnr` = `tlocation`.`locationnr`))
)
SELECT t1.*,t2.`artikel`,t3.`artikel`,t4.`artikel`
FROM t1
LEFT JOIN t1 t2
ON t1.`auftragsnr2` = t2.`auftragsnr2`
AND t2.zeile = 2
LEFT JOIN t1 t3
ON t1.`auftragsnr2` = t3.`auftragsnr2`
AND t3.zeile = 3
LEFT JOIN t1 t4
ON t1.`auftragsnr2` = t4.`auftragsnr2`
AND t4.zeile = 4
WHERE t1.zeile = 1
Zeile 7 ist korrigiert. Ich nutze allerdings MS SQL Management Studio zur Syntaxprüfung und das mag die Hochstriche eh nicht, wer weiß vielleicht sind noch mehr Fehler drin.
Gerber
Gerber 01.09.2021 um 11:24:43 Uhr
Goto Top
Vor allem nutzt du MariaDB, nicht MySQL. Auch wenn die sich ähnlich sind sollte man da genau sein. MariaDB unterstützt ROW_NUMBER() ab Version 10.2:
https://mariadb.com/kb/en/row_number/#:~:text=ROW_NUMBER%20%28%29%20was% ....


Entschuldige, sry. 🙄🙄🙄.

Genau ich nutze MariaDB (MySQL-kompatibel).

Ich habe deinen Code genommen und nur um ROW_NUMBER() ergänzt, deinen Code aber nicht geprüft. Der Fehler steckt aber genau da, was die Fehlermeldung auch sagt: Zeile 7 ist die letzte Zeile des Selects und schließt mit einem Komma ab, dann kommt FROM. Das ist natürlich falsch

Also der genau Code kann es nicht sein, da "leistungsdatum" in der Tabelle Auftrag steckt. Bei dir im Code steckt er in tArtikel.

Dies habe ich geändert und bekomme dann folgende Fehlermeldung:

SQL Error: Duplicate column name 'artikel'  

Hier nochmal meine komplette View (das oben in der Frage war nur ein Auszug):

select 
  `tauftrag`.`auftragsnr2` AS `auftragsnr2`,
  `tauftrag`.`leistungsdatum` AS `leistungsdatum`,
  `tauftrag`.`full` AS `full`,
  `tartikel`.`artikel` AS `artikel`,
  `tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,
  `tauftrag`.`status` AS `status`,
  `tlocation`.`name` AS `name`,
  `tlocation`.`plz` AS `plz`,
  `tlocation`.`ort` AS `ort`,
  `tlocation`.`strasse` AS `strasse`,
  `tlocation`.`hausnummer` AS `hausnummer`,
  `tauftrag`.`aufbaudurch` AS `aufbaudurch` 
from (((`tauftrag` 
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr` = `tauftragartikel`.`auftragsnr`)) 
  join `tartikel` on
    (`tauftragartikel`.`artikelnr` = `tartikel`.`artikelnr`)) 
  join `tlocation` on
    (`tauftrag`.`locationnr` = `tlocation`.`locationnr`)) 

Grüße
Phil
ukulele-7
Lösung ukulele-7 01.09.2021 um 11:37:12 Uhr
Goto Top
Ah okay wir kommen der Sache näher
WITH t1 AS (
select 
ROW_NUMBER() OVER (PARTITION BY `tauftrag`.`auftragsnr2` ORDER BY `tartikel`.`leistungsdatum`,`tartikel`.`artikel`) AS zeile,
  `tauftrag`.`auftragsnr2` AS `auftragsnr2`,
  `tauftrag`.`leistungsdatum` AS `leistungsdatum`,
  `tauftrag`.`full` AS `full`,
  `tartikel`.`artikel` AS `artikel`,
  `tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,
  `tauftrag`.`status` AS `status`,
  `tlocation`.`name` AS `name`,
  `tlocation`.`plz` AS `plz`,
  `tlocation`.`ort` AS `ort`,
  `tlocation`.`strasse` AS `strasse`,
  `tlocation`.`hausnummer` AS `hausnummer`,
  `tauftrag`.`aufbaudurch` AS `aufbaudurch` 
from (((`tauftrag` 
  join `tauftragartikel` on
    (`tauftrag`.`auftragsnr` = `tauftragartikel`.`auftragsnr`)) 
  join `tartikel` on
    (`tauftragartikel`.`artikelnr` = `tartikel`.`artikelnr`)) 
  join `tlocation` on
    (`tauftrag`.`locationnr` = `tlocation`.`locationnr`)) 
)
SELECT t1.*,t2.`artikel` AS artikel2,t3.`artikel` AS artikel3,t4.`artikel` AS artikel4
FROM t1
LEFT JOIN t1 t2
ON t1.`auftragsnr2` = t2.`auftragsnr2`
AND t2.zeile = 2
LEFT JOIN t1 t3
ON t1.`auftragsnr2` = t3.`auftragsnr2`
AND t3.zeile = 3
LEFT JOIN t1 t4
ON t1.`auftragsnr2` = t4.`auftragsnr2`
AND t4.zeile = 4
WHERE t1.zeile = 1
Habe deinen vollen Code da eingesetzt und der Fehler dürfte so nicht mehr kommen weil ich Aliase vergeben habe. Das kann man alles verfeinern wenn das Query läuft, bitte nochmal testen.
Gerber
Gerber 01.09.2021 um 11:48:57 Uhr
Goto Top
Danke dir nochmals für deine Hilfe face-smile

Also ich habe nochmals oben in deinem Code `tartikel`.`leistungsdatum` auf `tauftrag`.`leistungsdatum` umgeändert.

Und die Abfrage funktioniert.... 😊😊😊💪💪💪.

Geniaaaaal:

###

Was würdest du jetzt an dem Code noch optimieren?

Grüße
Phil
abfrage
ukulele-7
ukulele-7 01.09.2021 um 12:11:45 Uhr
Goto Top
Was würde ich ändern:
- Die Syntax ist jetzt nicht ganz einheitlich, da hat jeder seinen eigenen Stil und Verständnis.
- In ROW_NUMBER() gibt es ein ORDER BY, das war jetzt erstmal ein von mir geratener Ansatz. Eventuell gibt es noch eine schönere Sortierung.
- Statt t1.* sollte man die Spalten explizit benennen wenn der Code produktiv eingesetzt wird. Ist einfach sauberer. Man kann dann im gleichen Zug aus artikel auch artikel1 machen.
Gerber
Gerber 01.09.2021 um 12:18:45 Uhr
Goto Top
Danke dir.

Also wenn ich über mein MySQL Tool den Code kompiliere, wird mir daraus folgendes gemacht:

with t1 as (select
   row_number() over ( partition by `db68121`.`tauftrag`.`auftragsnr2` 
order by
   `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`artikel`) AS `zeile`,`db68121`.`tauftrag`.`auftragsnr2` AS `auftragsnr2`,`db68121`.`tauftrag`.`leistungsdatum` AS `leistungsdatum`,`db68121`.`tauftrag`.`full` AS `full`,`db68121`.`tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,`db68121`.`tauftrag`.`status` AS `status`,`db68121`.`tlocation`.`name` AS `name`,`db68121`.`tlocation`.`plz` AS `plz`,`db68121`.`tlocation`.`ort` AS `ort`,`db68121`.`tlocation`.`strasse` AS `strasse`,`db68121`.`tlocation`.`hausnummer` AS `hausnummer`,`db68121`.`tauftrag`.`aufbaudurch` AS `aufbaudurch`,`db68121`.`tartikel`.`artikel` AS `artikel` 
from
   (((`db68121`.`tauftrag` join `db68121`.`tauftragartikel` on(`db68121`.`tauftrag`.`auftragsnr` = `db68121`.`tauftragartikel`.`auftragsnr`)) join `db68121`.`tartikel` on(`db68121`.`tauftragartikel`.`artikelnr` = `db68121`.`tartikel`.`artikelnr`)) join `db68121`.`tlocation` on(`db68121`.`tauftrag`.`locationnr` = `db68121`.`tlocation`.`locationnr`)))select `t1`.`zeile` AS `zeile`,`t1`.`auftragsnr2` AS `auftragsnr2`,`t1`.`leistungsdatum` AS `leistungsdatum`,`t1`.`full` AS `full`,`t1`.`auslieferungsdatum` AS `auslieferungsdatum`,`t1`.`status` AS `status`,`t1`.`name` AS `name`,`t1`.`plz` AS `plz`,`t1`.`ort` AS `ort`,`t1`.`strasse` AS `strasse`,`t1`.`hausnummer` AS `hausnummer`,`t1`.`aufbaudurch` AS `aufbaudurch`,`t1`.`artikel` AS `artikel`,`t2`.`artikel` AS `artikel2`,`t3`.`artikel` AS `artikel3`,`t4`.`artikel` AS `artikel4` from (((`t1` left join (select row_number() over ( partition by `db68121`.`tauftrag`.`auftragsnr2` order by `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`artikel`) AS `zeile`,`db68121`.`tauftrag`.`auftragsnr2` AS `auftragsnr2`,`db68121`.`tauftrag`.`leistungsdatum` AS `leistungsdatum`,`db68121`.`tauftrag`.`full` AS `full`,`db68121`.`tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,`db68121`.`tauftrag`.`status` AS `status`,`db68121`.`tlocation`.`name` AS `name`,`db68121`.`tlocation`.`plz` AS `plz`,`db68121`.`tlocation`.`ort` AS `ort`,`db68121`.`tlocation`.`strasse` AS `strasse`,`db68121`.`tlocation`.`hausnummer` AS `hausnummer`,`db68121`.`tauftrag`.`aufbaudurch` AS `aufbaudurch`,`db68121`.`tartikel`.`artikel` AS `artikel` from (((`db68121`.`tauftrag` join `db68121`.`tauftragartikel` on(`db68121`.`tauftrag`.`auftragsnr` = `db68121`.`tauftragartikel`.`auftragsnr`)) join `db68121`.`tartikel` on(`db68121`.`tauftragartikel`.`artikelnr` = `db68121`.`tartikel`.`artikelnr`)) join `db68121`.`tlocation` on(`db68121`.`tauftrag`.`locationnr` = `db68121`.`tlocation`.`locationnr`))) `t2` on(`t1`.`auftragsnr2` = `t2`.`auftragsnr2` and `t2`.`zeile` = 2)) left join (select row_number() over ( partition by `db68121`.`tauftrag`.`auftragsnr2` order by `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`artikel`) AS `zeile`,`db68121`.`tauftrag`.`auftragsnr2` AS `auftragsnr2`,`db68121`.`tauftrag`.`leistungsdatum` AS `leistungsdatum`,`db68121`.`tauftrag`.`full` AS `full`,`db68121`.`tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,`db68121`.`tauftrag`.`status` AS `status`,`db68121`.`tlocation`.`name` AS `name`,`db68121`.`tlocation`.`plz` AS `plz`,`db68121`.`tlocation`.`ort` AS `ort`,`db68121`.`tlocation`.`strasse` AS `strasse`,`db68121`.`tlocation`.`hausnummer` AS `hausnummer`,`db68121`.`tauftrag`.`aufbaudurch` AS `aufbaudurch`,`db68121`.`tartikel`.`artikel` AS `artikel` from (((`db68121`.`tauftrag` join `db68121`.`tauftragartikel` on(`db68121`.`tauftrag`.`auftragsnr` = `db68121`.`tauftragartikel`.`auftragsnr`)) join `db68121`.`tartikel` on(`db68121`.`tauftragartikel`.`artikelnr` = `db68121`.`tartikel`.`artikelnr`)) join `db68121`.`tlocation` on(`db68121`.`tauftrag`.`locationnr` = `db68121`.`tlocation`.`locationnr`))) `t3` on(`t1`.`auftragsnr2` = `t3`.`auftragsnr2` and `t3`.`zeile` = 3)) left join (select row_number() over ( partition by `db68121`.`tauftrag`.`auftragsnr2` order by `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`artikel`) AS `zeile`,`db68121`.`tauftrag`.`auftragsnr2` AS `auftragsnr2`,`db68121`.`tauftrag`.`leistungsdatum` AS `leistungsdatum`,`db68121`.`tauftrag`.`full` AS `full`,`db68121`.`tauftrag`.`auslieferungsdatum` AS `auslieferungsdatum`,`db68121`.`tauftrag`.`status` AS `status`,`db68121`.`tlocation`.`name` AS `name`,`db68121`.`tlocation`.`plz` AS `plz`,`db68121`.`tlocation`.`ort` AS `ort`,`db68121`.`tlocation`.`strasse` AS `strasse`,`db68121`.`tlocation`.`hausnummer` AS `hausnummer`,`db68121`.`tauftrag`.`aufbaudurch` AS `aufbaudurch`,`db68121`.`tartikel`.`artikel` AS `artikel` from (((`db68121`.`tauftrag` join `db68121`.`tauftragartikel` on(`db68121`.`tauftrag`.`auftragsnr` = `db68121`.`tauftragartikel`.`auftragsnr`)) join `db68121`.`tartikel` on(`db68121`.`tauftragartikel`.`artikelnr` = `db68121`.`tartikel`.`artikelnr`)) join `db68121`.`tlocation` on(`db68121`.`tauftrag`.`locationnr` = `db68121`.`tlocation`.`locationnr`))) `t4` on(`t1`.`auftragsnr2` = `t4`.`auftragsnr2` and `t4`.`zeile` = 4)) 
where
   `t1`.`zeile` = 1

Ich muss mir deinen Code dann einmal komplett unter die Lupe nehmen um diesen auch zu verstehen.
Er funktioniert jetzt zwar, aber was jetzt genau was macht, muss ich mir noch anschauen 😅.
Gerber
Gerber 01.09.2021 um 12:24:00 Uhr
Goto Top
Nachtrag:

Was mir jetzt noch auffällt.
Es wird immer alphabetisch nach den Artikeln sortiert. Heißt Artikel 1 ist z.B. mit A beginnend. Artikel 2 dann mit D beginnend und Artikel 3 mit V beginnend.

Gibt es eine Möglichkeit, dass die Artikel so aufgelistet werden, wie die zuerst in der Abfrage beim Kunden gefunden werden?

Falls nicht möglich auch kein Problem face-wink.
Wäre jetzt nice to have.
ukulele-7
ukulele-7 01.09.2021 um 13:35:39 Uhr
Goto Top
Also das ORDER BY bestimmt die Sortierung
order by
   `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`artikel`)
Das heißt bei gleichem Leistungsdatum geht's nach Artikel weiter, alphabetisch. Du kannst ORDER BY eventuell komplett weg lassen oder mit ORDER BY 1 ersetzen oder so, aber das PARTITION BY davor muss bleiben. Ich weiß nicht ob MariaDB das schluckt = testen. Aber: Keine Sortierung bedeutet nicht, das es ein "zuerst" gibt, es ist einfach unspezifisch und theoretisch willkürlich. Wenn du noch irgend eine andere Spalte hast (z.B. einen Zeitstempel) die das sinnvoller ordnen kann würde ich die nehmen.
Gerber
Gerber 01.09.2021 aktualisiert um 13:52:21 Uhr
Goto Top
Das heißt bei gleichem Leistungsdatum geht's nach Artikel weiter, alphabetisch. Du kannst ORDER BY eventuell komplett weg lassen oder mit ORDER BY 1 ersetzen oder so, aber das PARTITION BY davor muss bleiben. Ich weiß nicht ob MariaDB das schluckt = testen. Aber: Keine Sortierung bedeutet nicht, das es ein "zuerst" gibt, es ist einfach unspezifisch und theoretisch willkürlich. Wenn du noch irgend eine andere Spalte hast (z.B. einen Zeitstempel) die das sinnvoller ordnen kann würde ich die nehmen.

Alles klar, danke dir für die Erklärung.

Ich habe noch ein Feld "eintragam" in der Tabelle tartikel hier wird der genaue Zeitstempel eingetragen, wann der Artikel angelegt wurde.


Heißt ich müsste dann einfach:
order by
   `db68121`.`tauftrag`.`leistungsdatum`,`db68121`.`tartikel`.`eintragam`)
Gerber
Gerber 01.09.2021 aktualisiert um 14:03:27 Uhr
Goto Top
Nachtrag:

Ändere ich den Order By wie von mir oben beschrieben, so habe ich an Artikel und Artikel 3 den gleichen Artikel stehen.

🤔🤔

Und direkt nochmals ein Edit:

Habe die View nochmal neu erstellt und scheint zu funktionieren:

Ich habe jetzt orderby komplett über tartikel.eintragam durchgeführt.
ukulele-7
ukulele-7 03.09.2021 um 10:58:56 Uhr
Goto Top
Joa das sollte reichen um das chronologisch zu sortieren.
Gerber
Gerber 03.09.2021 um 11:12:54 Uhr
Goto Top
Joa das sollte reichen um das chronologisch zu sortieren.

Yes, funktioniert jetzt super.
Danke nochmals für deine Hilfe und Geduld.

Grüße