highpriest
Goto Top

Gleiche Zeilen aus der Datenbank zusammenfassen

Hallo Experten!

Ich bin ein PHP-Anfänger und brauche Eure Hilfe!

Ich habe folgene Tabelle:

Auftrag Artikel Menge
1A11
2A23
2A52
2A45
3A71
3A12

Mit diesem Code:
$sql = "SELECT * FROM Tabelle WHERE ...;  
                
$db_erg = odbc_exec( $db_link, $sql );

                
echo '<table>';  
echo '<thead style="border-bottom: 2px solid black">';  
  echo '<tr>';  
  echo '<th>Auftrag</th>';  
  echo '<th>Artikel</th>';  
  echo '<th>Menge</th>';  
  echo '</tr>';  
  echo '</thead>';  
  echo '<tbody>';  
  echo "<tr>";  
while ($zeile = odbc_fetch_array( $db_erg))
{
  echo "<tr>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Auftrag'] . "</td>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Artikel'] . "</td>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Menge'] . "</td>";  
  echo "</tr>";   
}
echo '</tbody>';  
echo "</table>";  

sieht meine Ausgabe so aus:

Auftrag Artikel Menge
1A11
2A23
2A52
2A45
3A71
3A12

Ich möchte aber erreichen, dass die Ausgabe so aussieht:

Auftrag Artikel Menge
1A11
2A2
A5
A4
3
2
5
3A7
A1
1
2

Ich habe schon einiges probiert (for, foreach), auch viel geucht und gelesen aber ich kriege es einfach nicht hin.
Wie muss ich while-Schleife erweitern, damit es funktioniert.

Ich bedanke mich schon mal Voraus für jeden Tip!

Gruß
highpriest

Content-ID: 570974

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

wiesi200
wiesi200 10.05.2020 um 14:02:42 Uhr
Goto Top
Hallo,
merk am Ende der Schleife die Auftragsnummer die Auftragsnummer in einer Variable und am Anfang der Schleife mit if die Aktuelle und die Alte Auftragsnummer. Entsprechend setzt du den Rahmen der Zellen
em-pie
em-pie 10.05.2020 aktualisiert um 14:15:24 Uhr
Goto Top
Moin,

ich würde das direkt im SQL-Statement abfrühstücken:

Deine Freunde hier: STUFF und FOR XML PATH:
https://sqlwhisper.wordpress.com/2013/03/24/stuff-and-for-xml-path-for-s ...

und als "Delimiter" ein CHAR(10) einfügen.

Achja, obiges Gilt nur für MS SQL...


Gruß
em-pie
144260
144260 10.05.2020 aktualisiert um 14:37:40 Uhr
Goto Top
ich würde das direkt im SQL-Statement abfrühstücken:
Me too, bei MySQL z.B. mit GROUP_CONCAT
SELECT
    Auftrag,
    GROUP_CONCAT(Artikel SEPARATOR '<br/>') as Artikel,  
    GROUP_CONCAT(Menge SEPARATOR '<br/>') as Mengen  
FROM Tabelle
GROUP BY Auftrag
ORDER BY Auftrag;
highpriest
highpriest 10.05.2020 um 19:23:10 Uhr
Goto Top
@em-pie, @144260
Es funktioniert leider nicht, bekomme immer SQL- Fehlermeldung.
Liegt es vielleicht daran, dass es ein Acces-Datenbank ist?

@wiesi200
Dein Einsatz ist gut, komme endlich voran.
Jetzt habe ich damit die Datensätze in eine Zeile gruppiert.
Nur ich kriege sie nicht in eine Spalte, das Ergebniss sieht jetzt so aus:

Auftrag Artikel Menge
1A11
2A23A52A45
3A77A12

Ich sehe auch warum das so ist, finde aber keine Lösung, stehe auf dem Schlauch.
Kannst du bitte das mal anschauen, soll hier vielleicht noch eine verschachtelte if-Schleife für die beiden Spalten?

$sql = "SELECT * FROM Tabelle WHERE ...;  
                
$db_erg = odbc_exec( $db_link, $sql );

                
echo '<table>';  
echo '<thead style="border-bottom: 2px solid black">';  
  echo '<tr>';  
  echo '<th>Auftrag</th>';  
  echo '<th>Artikel</th>';  
  echo '<th>Menge</th>';  
  echo '</tr>';  
  echo '</thead>';  
  echo '<tbody>';  
  echo "<tr>";  

$Auftrag_neu = 0;

while ($zeile = odbc_fetch_array( $db_erg))
{

if ($zeile['Auftrag'] != $Auftrag_neu) {  

  echo "<tr>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Auftrag'] . "</td>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Artikel'] . "</td>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Menge'] . "</td>";  
}
else {
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Artikel'] . "</td>";  
  echo "<td style='border-bottom:1px solid #a5a5a5'>" . $zeile['Menge'] . "</td>";  
}
$Auftrag_neu = $zeile['Auftrag'];  
}
echo "</tr>";  

echo '</tbody>';  
echo "</table>";  
wiesi200
wiesi200 10.05.2020 um 19:37:56 Uhr
Goto Top
Tausche doch mal Zeile 34 und 35 gegeneinander aus. Aktuell hast du den Zeilenabschluss der Tabelle ausserhalb deiner Schleife.

Dann wirst du noch ein Problem bekommen das du unterschiedliche Spaltenzahlen hast. Sprich du brauchst eine leere Zelle mit einer anderen Rahmenvormatierung.
Ich würde dir mal raten den HTML Code der Tabelle mit der Hand zu schreiben und dann mit dem von PHP erzeugten Code zu vergleichen.
Du könntest auch mit Rowspan arbeiten um die Spalten wirklich zu verbinden.

Dann würd ich persönlich nicht den Styleattribut in jedes einzelne Feld schreiben sonder mit CSS Klassen Arbeiten.
em-pie
em-pie 10.05.2020 um 20:33:19 Uhr
Goto Top
Zitat von @highpriest:

@em-pie, @144260
Es funktioniert leider nicht, bekomme immer SQL- Fehlermeldung.
Liegt es vielleicht daran, dass es ein Acces-Datenbank ist?
OK, die Info wäre ganz hilfreich gewesen.
Wobei man fairerweise ja sagen muss, dass du ja nicht nach einer SQL- bzw. Query-Lösung gefragt/ gesucht hast.

Was dir dennoch helfen könnte:
https://stackoverflow.com/questions/21380730/ms-access-equivalent-of-for ...
Ansatz hier: ConcatRelated()
highpriest
highpriest 22.05.2020, aktualisiert am 23.05.2020 um 19:21:26 Uhr
Goto Top
Die Lösung ConcatRelated() klingt vielversprechend. Nur leider bekomme ich dabei die Fehlermeldung:
Undefinierte Funktion 'ConcatRelated' in Ausdruck., SQL state 37000 in SQLExecDirect in...  Ungültige Abfrage: 37000  
Was mache ich falsch?