GROUP BY MySQL <-> MSSQL

rauchmelder

Mitglied
Hi,

als ewiger MySQL User, hab ich mir so einige Schlampereien angewöhnt, die mir der MSSQL-Server jetzt verbietet...

Gerade aber jetzt brauche ich etwas, dass mir der MySQL - Server durchgehen lassen würde, auf dem MSSQL - Server,...

Es geht um eine GROUP BY Clause. Standardverhalten bei MySQL ist ja bekanntlich, dass alle Spalten die nicht mit einer Aggregatfunktion und auch nicht in der GROUP BY Clause behandelt werden "random" selektiert werden. D.h. man weiß vorher nicht aus welcher Zeile dieser Wert kommt.

Der MSSQL - Server unterbindet aber genau dies (aus gutem Grund!) weil eben nicht sicher ist aus welcher Zeile der Wert kommt.
In meinem Fall ist es mir aber egal aus welcher Zeile der Wert kommt, da der einzige Unterschied ist bei gleicher Artikelnummer, "Grünes Auto" oder "Auto: Farbe Grün". Und da die Liste nur zur Auswertung gedacht ist komplett irrelevant.

Das die Datenbank zusammengeräumt gehört, und es eigentlich gar nicht sein dürfte, dass 2 Artikeln bei gleicher Artikelnummer unterschiedliche Bezeichnungen haben ist ein anderes verbrechen.

Die Artikel kommen aus 2 verschiedenen Tabellen, und manche sind in Beiden, andere nur in einer der Beiden vorhanden.
Also wurde ein UNION dazwischen geklatscht und danach gruppiert.

Liebe Grüße,

rauchmelder
 
Ich möchte wie oben beschrieben die Spalten gruppieren. Jedoch ohne Berücksichtigung der Bezeichnung, trotzdem soll diese im Endergebnis ausgegeben werden.
 
MySQL hat den Fehler dass es ein unvollständiges GROUP BY erlaubt. MySQL setzt einfach alle nicht explizit aufgelisteten Spalten in den GROUP BY. Andere DBMS werten dies als Fehler. Ergo muss jede Spalte die du ausgeben möchtest entweder in der GROUP BY sein oder mit einer Gropfunction (SUM, COUNT etc) versehen sein.

Um Probleme mit gleichen Spaltennamen in zu vermeiden kann man die Tabelle oder einen Alais mitgeben
SQL:
SELECT
	a.id AS a_id,
	b.id AS b_id,
	a.name AS name,
	SUM(a.value) AS a_total
FROM
	table_a AS a
	INNER JOIN table_b AS b
		ON a.id = b.id
GROUP BY
	a.id AS a_id,
	b.id AS b_id,
	a.name AS name
 
Zuletzt bearbeitet von einem Moderator:
Hmm, nein, da haben wir etwas aneinander vorbeigeschrieben. Beim letzten mal haben die Beispiele gut geholfen, drum Versuche ich es diesmal wieder so :).

Tabelle a
Artikelnummer, Bezeichnung
1, Grünes Auto
2, Blaues Auto
3, Rotes Auto
4, Oranges Auto

Tabelle b
Artikelnummer, Bezeichnung
1, Auto Grün
4, Auto Orange
5, Auto Gold
6, Auto Silber

Gewünschte Ausgabe:
Artikelnummer, Bezeichnung
1, Grünes Auto oder Auto Grün (mir egal, aber nicht beides)
2, Blaues Auto
3, Rotes Auto
4, Oranges Auto oder Auto Orange (mir egal, aber nicht beides)
5, Auto Gold
6, Auto Silber

Unter MySQL würde ich das so lösen:
SQL:
SELECT * FROM
(SELECT * FROM a
UNION
SELECT * FROM b)
GROUP BY Artikelnummer

Mit der Query die Sie verwendet haben würde die Ausgabe sich auf 1 und 4 beschränken und er würde mir
1, Grünes Auto
4, Oranges Auto
ausgeben...

Liebe Grüße,

rauchmelder
 
Zuletzt bearbeitet von einem Moderator:
Falls MS SQL Subqueries innerhalb des FROM zuläst könnte es etwa so gehen
SQL:
SELECT
	nr_list.artikelnummer,
	-- Nimm die erste Bezeichnung die nicht NULL ist
	COALESCE(a.bezeichnung, b.bezeichnung) AS bezeichnung
FROM
	-- Suche alle vorhanden IDs zusammen
	(SELECT DISTINCT artikelnummer FROM a
	UNION SELECT artikelnummer FROM b) AS nr_list
	-- und verninde sie mit den Tabellen
	LEFT JOIN a ON a.artikelnummer = nr_list.artikelnummer
	LEFT JOIN b ON b.artikelnummer = nr_list.artikelnummer
GROUP BY
	nr_list.artikelnummer
 
Zuletzt bearbeitet von einem Moderator:
Zurück