SQL-Gruppierung nach allen Spalten

74

Gibt es eine Möglichkeit, nach allen Spalten einer Tabelle zu gruppieren, ohne die Spaltennamen anzugeben? Mögen:

select * from table group by *
Stephen Ostermiller
quelle
Was versuchst du zu erreichen?
MarlonRibunal
50
Warum sollte dies eine bedeutungslose Frage sein? Scheint etwas zu sein, das jeder Anfänger-SQL-Programmierer fragen könnte.
Womp

Antworten:

53

Das DISTINCT-Schlüsselwort


Ich glaube, was Sie versuchen zu tun, ist:

SELECT DISTINCT * FROM MyFooTable;

Wenn Sie nach allen Spalten gruppieren, fordern Sie lediglich die Entfernung doppelter Daten an.

Zum Beispiel eine Tabelle mit folgenden Daten:

 id |     value      
----+----------------
  1 | foo
  2 | bar
  1 | foo
  3 | something else

Wenn Sie die folgende Abfrage ausführen, die im Wesentlichen mit der SELECT * FROM MyFooTable GROUP BY *Annahme identisch ist, dass * alle Spalten bedeutet:

SELECT * FROM MyFooTable GROUP BY id, value;

 id |     value      
----+----------------
  1 | foo
  3 | something else
  2 | bar

Es werden alle doppelten Werte entfernt, was es im Wesentlichen semantisch identisch mit der Verwendung des Schlüsselworts DISTINCT macht, mit Ausnahme der Reihenfolge der Ergebnisse. Zum Beispiel:

SELECT DISTINCT * FROM MyFooTable;

 id |     value      
----+----------------
  1 | foo
  2 | bar
  3 | something else
Elijah
quelle
Ich denke das ist nicht richtig. Wenn Sie row_number () für etwas verwenden, zählt die eindeutige Anzahl mehr. Wenn ich einen x_code habe, der zwei y_code per join hat, bringt mir das "different" 2 Zeilen und zählt zweimal über row_number (), aber wenn ich group by verwende, bringt mir korrekt nur eine. Ich mache es durch! Ich benötige eine sequenzielle Ganzzahlregistrierung und "eindeutige" Zählungen zählen mich zweimal auf x_code.
Natan Medeiros
Dies vermisst einige wichtige Fälle wie UDAFs
StephenBoesch
1
Die Verwendung von DISTINCT ist nicht immer direkt möglich. Wenn eine Abfrage die ORDER BY-Klausel enthält, wird möglicherweise die folgende Fehlermeldung angezeigt: 'FEHLER: Für SELECT DISTINCT müssen ORDER BY-Ausdrücke in der Auswahlliste angezeigt werden.' Die einzige Lösung in dieser Situation ist eine verschachtelte Abfrage AFAIK.
Prograils
15

Er versucht, die doppelten Zeilen in einer Tabelle zu finden und anzuzeigen.

SELECT *, COUNT(*) AS NoOfOccurrences
FROM TableName GROUP BY *
HAVING COUNT(*) > 1

Haben wir einen einfachen Weg, dies zu erreichen?

Girish
quelle
1
Woher weißt du, dass er Duplikate anzeigen möchte, anstatt nur unterschiedliche Zeilen anzuzeigen?
Pilcrow
1
Ich erhalte einen Syntaxfehler mit GROUP BY * in postgreSQL
Snow
11

Wenn Sie SqlServer verwenden, sollte das eindeutige Schlüsselwort für Sie funktionieren. (Nicht sicher über andere Datenbanken)

declare @t table (a int , b int)

insert into @t (a,b) select 1, 1
insert into @t (a,b) select 1, 2
insert into @t (a,b) select 1, 1

select distinct * from @t

führt zu

a b
1 1
1 2
mjallday
quelle
4

Nee. Versuchen Sie eine Aggregation durchzuführen? Wenn ja, könnten Sie so etwas tun, um das zu bekommen, was Sie brauchen

;with a as
(
     select sum(IntField) as Total
     from Table
     group by CharField
)
select *, a.Total
from Table t
inner join a
on t.Field=a.Field
DForck42
quelle
4

Ich wollte über die gesamte Ergebnismenge zählen und summieren. Ich habe eine Gruppierung von allen mit erreicht GROUP BY 1=1.

Vojtěch
quelle
1
Ich weiß nicht, wie das funktioniert, aber es ist brillant und genau das, was ich brauchte. Ist dieser Trick irgendwo dokumentiert und wird er von allen wichtigen relationalen DBs unterstützt?
kosmičák
3

Nein, da dies im Grunde bedeutet, dass Sie nichts gruppieren. Wenn Sie nach allen Spalten gruppieren (und eine ordnungsgemäß definierte Tabelle mit einem eindeutigen Index haben), SELECT * FROM tableist dies im Wesentlichen dasselbe wie SELECT * FROM table GROUP BY *.

jellomonkey
quelle
21
Wenn Sie keinen eindeutigen Index haben, ist die Tabelle SELECT * FROM natürlich nicht mit der Tabelle SELECT * FROM GROUP BY * identisch. In diesem Fall können Sie dies mit der Tabelle SELECT DISTINCT * FROM erreichen.
Sören Kuklau
7
Doppelte Zeilen sind eine häufige Sache, mit der Sie sich befassen müssen, wenn Sie Projekte erben. Ich glaube daher nicht, dass man davon ausgehen kann, dass jemand niemals doppelte Zeilen entfernen möchte.
Elijah
6
Es gibt noch einen anderen Fall ... SELECT t1. *, Count (t2.items) FROM t1 LEFT JOIN t2 ON t1.id = t2.id GROUP BY t1. *
Danny Dulai
2

Kurze Antwort: nein. GROUP BY-Klauseln erfordern an sich eine Reihenfolge, in der sie Ihre Ergebnisse ordnen. Eine andere Reihenfolge der Feldgruppierungen würde zu unterschiedlichen Ergebnissen führen.

Die Angabe eines Platzhalters würde die Anweisung für Interpretationen und unvorhersehbares Verhalten offen lassen.

womp
quelle
1
"offen für Interpretationen" Dies lässt sich leicht beheben, indem die natürliche Reihenfolge der Spalten angegeben wird - dh die Reihenfolge, in der sie definiert sind. Eine Platzhalter-Syntax wäre eine nützliche Funktion.
StephenBoesch
-1

Hier ist mein Vorschlag:

DECLARE @FIELDS VARCHAR(MAX), @NUM INT

--DROP TABLE #FIELD_LIST

SET @NUM = 1
SET @FIELDS = ''

SELECT 
'SEQ' = IDENTITY(int,1,1) ,
COLUMN_NAME
INTO #FIELD_LIST
FROM Req.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'new340B'

WHILE @NUM <= (SELECT COUNT(*) FROM #FIELD_LIST)
BEGIN
SET @FIELDS = @FIELDS + ',' + (SELECT COLUMN_NAME FROM #FIELD_LIST WHERE SEQ = @NUM)
SET @NUM = @NUM + 1
END

SET @FIELDS = RIGHT(@FIELDS,LEN(@FIELDS)-1)

EXEC('SELECT ' + @FIELDS + ', COUNT(*) AS QTY FROM [Req].[dbo].[new340B] GROUP BY ' + @FIELDS + ' HAVING COUNT(*) > 1  ') 
Sag niemals nie
quelle
-2

Sie können Group by All verwenden, aber seien Sie vorsichtig, da Group by All aus zukünftigen Versionen von SQL Server entfernt wird.

Ravi
quelle
2
´Group by All´ hat nichts mit Gruppierung nach allen Spalten zu tun!
Patrick Honorez