zusammenaddiert innerhalb einer SELECT Abfrage – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self?srt=yes zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 13:43:19 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806357?srt=yes#m1806357 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806357?srt=yes#m1806357 <p>Hallo, nachdem ich ein fleißiger Leser bin und mir sehr sehr viel hier herausgelesen habe, stelle ich doch mal eine Frage.</p> <p>Ich erstelle ein Script mit dem man mehrere Abstimmungen ausführen kann. Jetzt habe ich ein SQL Problem, das mich fuxt.</p> <p>Mit der folgenden SQL Abfrage bekomme ich meinen Datensatz für die jeweilige Abstimmung</p> <pre><code class="block">SELECT a.id, a.questions_de AS answer,a.total FROM poll_questions a WHERE a.id_poll=:id </code></pre> <p>unter total, wird bei jeder Stimmabgabe für den betreffenden Satz die Stimme addiert.</p> <p>Jetzt möchte ich gerne bei der Ausgabe, ein Feld haben, in der alle Stimmen zusammenaddiert sind (alle total Felder).</p> <p>Mein Versuch mit SUM ist kläglich gescheitert.</p> <pre><code class="block">SELECT SUM(a.total) AS total_vote, a.id, a.questions_de AS answer,a.total FROM poll_questions a WHERE a.id_poll=:id </code></pre> <p>Ich habe zwar das Ergebnis bei total_vote, doch es wird mir nur noch ein Datensatz ausgegeben.</p> <p>Michael</p> Die Summe des Alters des dritten Kindes von links ... Tue, 21 Feb 23 14:02:51 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806358?srt=yes#m1806358 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806358?srt=yes#m1806358 <p>Naja...</p> <blockquote> <pre><code class="block">SELECT SUM ... WHERE a.id_poll=:id </code></pre> </blockquote> <blockquote> <p>doch es wird mir nur noch ein Datensatz ausgegeben.</p> </blockquote> <p>Du hast es doch <strong>genau so bestellt</strong> - oder? Die Summe des Alters des dritten Kindes von links ist das Alter des dritten Kindes von links und nicht die Summe des Alters aller Kinder.</p> zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 16:27:46 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806362?srt=yes#m1806362 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806362?srt=yes#m1806362 <p>Hallo Michael,</p> <blockquote> <p>Mein Versuch mit SUM ist kläglich gescheitert.</p> </blockquote> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token function">SUM</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>total<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_vote<span class="token punctuation">,</span> a<span class="token punctuation">.</span>id<span class="token punctuation">,</span> a<span class="token punctuation">.</span>questions_de <span class="token keyword">AS</span> answer<span class="token punctuation">,</span>a<span class="token punctuation">.</span>total <span class="token keyword">FROM</span> poll_questions a <span class="token keyword">WHERE</span> a<span class="token punctuation">.</span>id_poll<span class="token operator">=</span>:id </code></pre> <p>Die ID musst Du nicht im SELECT aufführen, weil Du sie eh schon kennst.</p> <p>SUM() ist eine Aggregatfunktion und MYSQL tut, was es soll: es aggregiert und liefert ohne GROUP BY nur eine Zeile zurück. Und damit gelangen wir zu meinem Lieblings-Rant:</p> <h3>Werden aggregierte Spalten verwendet, muss jede nicht aggregierte Spalte eine Konstante sein oder in einer GROUP BY Klausel angegeben werden.</h3><p>Ich hasse MYSQL, weil es diesen Verstoß gegen die SQL Regeln zulässt.</p> <p>Und ich predige es immer wieder: Diese Mischung ist toxisch, weil der Wert der ungruppierten Spalten undefiniert ist (heißt: der Server kann sich die Row aussuchen, deren Wert er verwendet.</p> <p>Bei der ID ist es egal. Die ist eh für alle Rows gleich. Aber welchen Wert soll er bei questions_de oder total auswählen?</p> <p>GROUP BY hilft Dir hier aber nicht, weil du bestenfalls nach der id gruppieren könntest.</p> <p>Deine SQL Abfrage ist logisch unsinnig. Eine Mischung aus aggregierten und nicht aggregierten Daten in einer Query passt nicht zusammen - das sind zwei unterschiedliche Sichten auf die Daten und eine Query sollte nur eine Sicht liefern. Denn andernfalls musst Du das Query-Ergebnis nachher im Programm auseinandernehmen und die Dinge, die zu unterschiedlichen Sichten gehören, wieder trennen.</p> <p>Heißt hier: Du musst die Summe wieder von den Einzeldaten trennen.</p> <p>Was Du keinesfalls willst, ist, die Summe für jede Einzelzeile zu berechnen. Auch dann müsstest Du die Daten trennen (du müsstest Dir die Summe in der Zeilenschleife merken und sie nach der Schleife verwenden). Diese Query käme deinem Versuch wohl am nächsten, <strong>aber verwende sie bloß nicht</strong>:</p> <pre><code class="block bad language-sql"><span class="token keyword">SELECT</span> a<span class="token punctuation">.</span>questions_de <span class="token keyword">AS</span> answer <span class="token punctuation">,</span> a<span class="token punctuation">.</span>total <span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">SUM</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>total<span class="token punctuation">)</span> <span class="token keyword">FROM</span> poll_questions b <span class="token keyword">WHERE</span> b<span class="token punctuation">.</span>id <span class="token operator">=</span> :id<span class="token punctuation">)</span> <span class="token keyword">as</span> total_vote <span class="token keyword">FROM</span> poll_questions a <span class="token keyword">WHERE</span> a<span class="token punctuation">.</span>id_poll<span class="token operator">=</span>:id </code></pre> <p>Brrr - der SQL Server müsste für jede Ergebniszeile neu summieren.</p> <p>Was man tun könnte, wäre, die Summe an die Einzelzeilen als separate Zeile anzuhängen, mit dem UNION ALL Operator. Wegen der schon diskutierten Rangvermischung rate ich dringend davon ab.</p> <pre><code class="block bad language-sql"><span class="token keyword">SELECT</span> <span class="token number">0</span> <span class="token keyword">as</span> Rang<span class="token punctuation">,</span> a<span class="token punctuation">.</span>questions_de <span class="token keyword">AS</span> answer<span class="token punctuation">,</span> a<span class="token punctuation">.</span>total <span class="token keyword">FROM</span> poll_questions a <span class="token keyword">WHERE</span> a<span class="token punctuation">.</span>id_poll<span class="token operator">=</span>:id <span class="token keyword">UNION</span> <span class="token keyword">ALL</span> <span class="token keyword">SELECT</span> <span class="token number">1</span> <span class="token keyword">as</span> Rang<span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>total<span class="token punctuation">)</span> <span class="token keyword">FROM</span> poll_questions a <span class="token keyword">WHERE</span> a<span class="token punctuation">.</span>id_poll<span class="token operator">=</span>:id </code></pre> <p>Die Detailzeilen bekommen Rang 0, die Summenzeile bekommt Rang 1. In der Summenzeile wird die ID als Konstante eingesteuert und die Antwort ist irrelevant, daher die NULL. Einzelzeilen und Summenzeile werden per UNION ALL zusammengefügt. UNION deshalb mit ALL, weil SQL andernfalls versucht, doppelte Zeilen zu finden und zu eliminieren. Die :id steht als Konstante in der SELECT-Liste des zweiten Select.</p> <p>Eine solche Query hat in genau einem Kontext Sinn: Wenn Du die im phpmyadmin eingibst, um schnell mal eine Aufstellung mit Details und Summe zu bekommen, ohne einen Reportgenerator anzuwerfen. In einem Programm hat eine solche Query nichts zu suchen.</p> <h3>Fazit: Bilde die Summe im PHP (oder im Reportgenerator).</h3><p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 14:09:33 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806359?srt=yes#m1806359 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806359?srt=yes#m1806359 <p>Nein, hier frage ich alle Antworten ab die für die Abstimmung möglich sind</p> <pre><code class="block">a.id_poll=:id </code></pre> <pre><code class="block">id_poll ! questions_de ! total 1 ! Frage 1 ! 10 1 ! Frage 2 ! 20 1 ! Frage 3 ! 30 1 ! Frage 4 ! 10 </code></pre> <p>und ich will alle Zeilen mit und ein Ergebnis mit allen Feldern aus Total.</p> <p>Michael</p> zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 14:14:00 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806360?srt=yes#m1806360 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806360?srt=yes#m1806360 <blockquote> <p>und ich will alle Zeilen mit und ein Ergebnis mit allen Feldern aus Total.</p> </blockquote> <p>So wie ich Dein Wollen verstehe brauchst Du entweder mehrere (genauer: zwei) Abfragen - oder Du summierst in der die Datenbank abfragenden Anwendung(¹), in der Du ja sowieso über alle Zeilen iterierst. Die Summenbildung ist mutmaßlich das mit großem Abstand Schnellste von allem, was Du da machst. (Was Performance-Fragen angeht ist mein Nickname „Programm“.)</p> <p>¹) Scheint PHP oder Python zu sein. Also geht das.</p> zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 16:55:34 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806363?srt=yes#m1806363 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806363?srt=yes#m1806363 <p>Moin,</p> <blockquote> <p>und ich will alle Zeilen mit und ein Ergebnis mit allen Feldern aus Total.</p> </blockquote> <p>Evtl. suchst du <a href="https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html" rel="nofollow noopener noreferrer">WINDOW-Funktionen</a>, damit lässt sich z.B. zusätzlich zu den eigentlichen Daten eine Summe über eine Teilmenge ermitteln.</p> <p>Wenn das nicht hilft, wäre es sinnvoll wenn du mal Tabellendefinition und ein paar Testdaten (CREATE TABLE- und INSERT-Querys in Textform) sowie das gewünschte Ergebnis posten würdest, damit lässt sich das Problem dann leichter nachstellen.</p> <p>Gruß<br> Tobias</p> zusammenaddiert innerhalb einer SELECT Abfrage -> mit PHP Thu, 23 Feb 23 11:26:13 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806412?srt=yes#m1806412 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806412?srt=yes#m1806412 <p>Danke für die Antworten. Ich wollte es einfach und praktisch machen. Doch einfach ist manchmal nicht die richtige Antwort. Ich berechne die Summe nach der Abfrage der Datenbank mittels PHP.</p> <p>Jedenfalls super für die ganzen Hinweise.</p> <p>Michael</p> zusammenaddiert innerhalb einer SELECT Abfrage Tue, 21 Feb 23 17:10:09 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806364?srt=yes#m1806364 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806364?srt=yes#m1806364 <blockquote> <p>Evtl. suchst du <a href="https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html" rel="nofollow noopener noreferrer">WINDOW-Funktionen</a>, damit lässt sich z.B. zusätzlich zu den eigentlichen Daten eine Summe über eine Teilmenge ermitteln.</p> </blockquote> <p>Hm. Kann man machen, verursacht aber bei einer hohen Anzahl von Treffern eine übergroße Menge zu transportierender und auszuwertender Daten. Die zusätzliche Spalte mit identischem Wert in jeder Zeile verlangsamt also den Datentransport und übrigens sodann auch die Verwertung. (Das muss ja alles „für nichts“ eingepackt, transportiert und sodann zerlegt werden.)</p> <p>Was dann dazu führt, dass die Gesamtzeit der komplexen Abfrage die der für zwei Abfragen oder der Summierung in der Anwendung klar übersteigt.</p> zusammenaddiert innerhalb einer SELECT Abfrage -> mit PHP Thu, 23 Feb 23 12:25:25 Z https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806423?srt=yes#m1806423 https://forum.selfhtml.org/self/2023/feb/21/zusammenaddiert-innerhalb-einer-select-abfrage/1806423?srt=yes#m1806423 <p>Erst einmal das „Danke für die Rückmeldung!“</p> <blockquote> <p>Doch einfach ist manchmal nicht die richtige Antwort. Ich berechne die Summe nach der Abfrage der Datenbank mittels PHP.</p> </blockquote> <p>Nanu? Genau das ist doch offensichtlich das Einfachste.</p>