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-Key: 52203355816

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

Printed on: April 29, 2024 at 07:04 o'clock

Member: mbehrens
mbehrens Jan 15, 2024 at 08:23:11 (UTC)
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.
Member: ukulele-7
ukulele-7 Jan 15, 2024 at 08:24:06 (UTC)
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?
Member: ukulele-7
ukulele-7 Jan 15, 2024 at 08:25:17 (UTC)
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/
Member: MirkoKR
MirkoKR Jan 15, 2024 at 08:34:43 (UTC)
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 ...
Member: mbehrens
mbehrens Jan 15, 2024 at 08:40:11 (UTC)
Goto Top
Zitat von @ukulele-7:

Welches SQL DBMS in welcher Version ist im Einsatz?

MS Access in einer unbekannten Version face-smile
Member: ukulele-7
ukulele-7 Jan 15, 2024 at 08:53:49 (UTC)
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.
Member: highpriest
highpriest Jan 15, 2024 at 09:40:53 (UTC)
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?
Member: MirkoKR
MirkoKR Jan 15, 2024 updated at 10:12:01 (UTC)
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 ...
Member: ukulele-7
ukulele-7 Jan 15, 2024 at 13:03:19 (UTC)
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.
Member: highpriest
highpriest Jan 23, 2024 at 14:44:42 (UTC)
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?
Member: ukulele-7
ukulele-7 Feb 08, 2024 at 14:28:20 (UTC)
Goto Top
Mit Access kenne ich keine Lösung, ich glaube nicht.

PHP ist nicht in meinem Sprachschatz aber das sollte gehen denke ich.
Mitglied: 11078840001
11078840001 Feb 08, 2024 updated at 15:38:18 (UTC)
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
Member: ukulele-7
ukulele-7 Feb 09, 2024 at 08:05:26 (UTC)
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 ).