highpriest
Goto Top

SQL oder PHP - Zellen zusamenführen

Hallo!

Ich suche nach einer SQL-Lösung in Access oder PHP, um mehrere Feldinhalte in eine Zelle zu schreiben, wenn die Inhalte in einem anderen Feld gleich sind.

Beispiel

Ausgangstabelle siet so aus:

|Auftrag |Art-Nr |Preis|
|1001 |123 |1,00 |
|1001 |345 |2,00 |
|1001 |567 |3,00 |
|1002 |123 |1,00 |
|1002 |345 |2,00 |

Gewünschte Ergebniss:

|Auftrag |Art-Nr |Preis|
|1001 |123, 345,567 | |
|1002 |123, 345 | |

Ist sowas mit SQL/PHP möglich, hat jemand einen Einsatz?

Content-ID: 52203355816

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

mbehrens
mbehrens 15.01.2024 um 09:23:11 Uhr
Goto Top
Zitat von @highpriest:

Ich suche nach einer SQL-Lösung in Access oder PHP, um mehrere Feldinhalte in eine Zelle zu schreiben, wenn die Inhalte in einem anderen Feld gleich sind.

Die gesuchten Stichwörter dürften TRANSFORM und PIVOT sein.
ukulele-7
ukulele-7 15.01.2024 um 09:24:06 Uhr
Goto Top
Du willst das in der Ausgabe so aggregiert anzeigen oder du willst die Daten entsprechend aggregiert in der Datenbank speichern? Letzteres wäre falsch, da nicht normalisiert, und maximal unpraktisch.

Welches SQL DBMS in welcher Version ist im Einsatz?
ukulele-7
ukulele-7 15.01.2024 um 09:25:17 Uhr
Goto Top
Zitat von @mbehrens:

Die gesuchten Stichwörter dürften TRANSFORM und PIVOT sein.
Wohl eher GROUP_CONCAT oder vergleichbares.
https://mariadb.com/kb/en/group_concat/
MirkoKR
MirkoKR 15.01.2024 um 09:34:43 Uhr
Goto Top
In PHP durchläufst du die nach Auftrag sortierte Ergebnistabelle und ...

... solange "Auftrag" dieselbe ist, ...

werden die "Art-Nr" mit üblichen String-Funktionen und Kommas, Leerzeichen aneinndergehängt ...
mbehrens
mbehrens 15.01.2024 um 09:40:11 Uhr
Goto Top
Zitat von @ukulele-7:

Welches SQL DBMS in welcher Version ist im Einsatz?

MS Access in einer unbekannten Version face-smile
ukulele-7
ukulele-7 15.01.2024 um 09:53:49 Uhr
Goto Top
Zitat von @mbehrens:

Zitat von @ukulele-7:

Welches SQL DBMS in welcher Version ist im Einsatz?

MS Access in einer unbekannten Version face-smile

Vade retro satana

Wenn PHP im Spiel ist, gehe ich einfach mal von MariaDB oder MySQL aus.
highpriest
highpriest 15.01.2024 um 10:40:53 Uhr
Goto Top
Zitat von @ukulele-7:
Welches SQL DBMS in welcher Version ist im Einsatz?
Das ist MS Access 2010 als Datenbank, über XAMPP auf der Webseite mit PHP sollen Ergebnisse angezeigt werden.


In PHP durchläufst du die nach Auftrag sortierte Ergebnistabelle und ...
... solange "Auftrag" dieselbe ist, ...
werden die "Art-Nr" mit üblichen String-Funktionen und Kommas, Leerzeichen aneinndergehängt ...

Das wäre evt. eine Lösung, wie würde es aussehen?
MirkoKR
MirkoKR 15.01.2024 aktualisiert um 11:12:01 Uhr
Goto Top
Zitat von @highpriest:

In PHP durchläufst du die nach Auftrag sortierte Ergebnistabelle und ...
... solange "Auftrag" dieselbe ist, ...
werden die "Art-Nr" mit üblichen String-Funktionen und Kommas, Leerzeichen aneinndergehängt ...

Das wäre evt. eine Lösung, wie würde es aussehen?

Kann es gerade nicht getestet liefern:
$Result = [DBQuery]
$Artikel="";  


While( ){ ## $Result durchlaufen

$Row = $Result.[Row]!

if ($Artikel <> $Row.[Artikel]){
  $Artikel = $Row.[Artikel];
  $Art-Nr = "";  
}
  if ($Art-Nr <> ""){  
     $Art-Nr .= ", ";  
  }
  $Art-Nr .= $Row.[Art-Nr];
}

##Ausgabe der Werte

} ## $Result Durchlauf Ende

Da sind sicher Fehler drin in Ablauf oder Variablen, etc ...
... evtl. postet ja noch jemand eine getestete / korrigierte Version ...
ukulele-7
ukulele-7 15.01.2024 um 14:03:19 Uhr
Goto Top
Zitat von @highpriest:

Zitat von @ukulele-7:
Welches SQL DBMS in welcher Version ist im Einsatz?
Das ist MS Access 2010 als Datenbank, über XAMPP auf der Webseite mit PHP sollen Ergebnisse angezeigt werden.
Okay bei Access hast du nicht wirklich viele Möglichkeiten, vielleicht sogar gar keine. Dann mach das besser mit PHP.
highpriest
highpriest 23.01.2024 um 15:44:42 Uhr
Goto Top
Egal, was ich probiere, funktioniert leider nicht.
So sieht meine "echte" Datenbank in Access aus:

AuftragsnummerSeriennummer
110ABC123
110BCD234
110CDE345
111EFG678
112FGH789
112GHJ890

Ergebniss soll dann in PHP so aussehen:
110ABC123, BCD234, CDE345
111EFG678
112FGH789, GHJ890

Ist das mit Access 2010 oder PHP machbar?
ukulele-7
ukulele-7 08.02.2024 um 15:28:20 Uhr
Goto Top
Mit Access kenne ich keine Lösung, ich glaube nicht.

PHP ist nicht in meinem Sprachschatz aber das sollte gehen denke ich.
11078840001
11078840001 08.02.2024 aktualisiert um 16:38:18 Uhr
Goto Top
Ausgangslage in Access, Tabelle Aufträge:

screenshot

VBA Modul in Access anlegen und die Funktion einfügen
Public Function ConcatValues(strField As String, strTable As String, WhereCondition As String, delimiter As String) As String
    On Error Resume Next
    Dim rec As Recordset, final As String
    Set rec = CurrentDb.OpenRecordset("SELECT " & strField & " FROM " & strTable & " WHERE " & WhereCondition)  
    rec.MoveFirst
    While Not rec.EOF
        final = final & rec.Fields(strField).Value & delimiter
        rec.MoveNext
    Wend
    ConcatValues = Left(final, Len(final) - Len(delimiter))
End Function

Dann neue Abfrage erstellen und in der SQL Ansicht das hier einfügen
SELECT 
    First(Auftragsnummer) as Auftragsnummer, 
    ConcatValues("Seriennummer","Aufträge","Auftragsnummer = """ & Auftragsnummer & """",",") AS Seriennummern  
FROM 
    Aufträge
GROUP BY 
    Auftragsnummer;

Oder über die GUI

screenshot

Ergebnis nach Ausführen der Abfrage:

screenshot


Alternativ wenn über PHP bspw. eine MYSQL Abfrage die so aussieht

SELECT 
    Auftragsnummer,
    GROUP_CONCAT(Seriennummer) AS Seriennummern
FROM 
    Aufträge
GROUP BY
    Auftragsnummer;

screenshot
ukulele-7
ukulele-7 09.02.2024 um 09:05:26 Uhr
Goto Top
Großes Lob an @11078840001 für die wirklich ausführliche Beschreibung von gleich zwei Varianten: VBA Funktion in Access oder PHP. Mein "mit Access keine Lösung" bezog sich natürlich auf reines SQL in Access, das ist ja leider sehr beschränkt (Es geht aber noch dünner wie ich immer wieder mal feststellen muss face-smile ).
highpriest
highpriest 11.06.2024 um 13:55:23 Uhr
Goto Top
Zitat von @11078840001:

Ausgangslage in Access, Tabelle Aufträge:

screenshot

VBA Modul in Access anlegen und die Funktion einfügen
Public Function ConcatValues(strField As String, strTable As String, WhereCondition As String, delimiter As String) As String
    On Error Resume Next
    Dim rec As Recordset, final As String
    Set rec = CurrentDb.OpenRecordset("SELECT " & strField & " FROM " & strTable & " WHERE " & WhereCondition)  
    rec.MoveFirst
    While Not rec.EOF
        final = final & rec.Fields(strField).Value & delimiter
        rec.MoveNext
    Wend
    ConcatValues = Left(final, Len(final) - Len(delimiter))
End Function

Dann neue Abfrage erstellen und in der SQL Ansicht das hier einfügen
SELECT 
    First(Auftragsnummer) as Auftragsnummer, 
    ConcatValues("Seriennummer","Aufträge","Auftragsnummer = """ & Auftragsnummer & """",",") AS Seriennummern  
FROM 
    Aufträge
GROUP BY 
    Auftragsnummer;

Oder über die GUI

screenshot

Ergebnis nach Ausführen der Abfrage:

screenshot


Alternativ wenn über PHP bspw. eine MYSQL Abfrage die so aussieht

SELECT 
    Auftragsnummer,
    GROUP_CONCAT(Seriennummer) AS Seriennummern
FROM 
    Aufträge
GROUP BY
    Auftragsnummer;

screenshot

Ich habe endlich wieder Zeit gefunden mich damit zu beschäftigen.
Ich habe alles nach der Anleitung gemacht, leider hängt sich Acces damit komplett auf. Ist evt. in dem VBA-Code ein Fehler drin?