Gibt es eine Möglichkeit, nach allen Spalten einer Tabelle zu gruppieren, ohne die Spaltennamen anzugeben? Mögen:
select * from table group by *
Gibt es eine Möglichkeit, nach allen Spalten einer Tabelle zu gruppieren, ohne die Spaltennamen anzugeben? Mögen:
select * from table group by *
Antworten:
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
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?
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
Ich wollte über die gesamte Ergebnismenge zählen und summieren. Ich habe eine Gruppierung von allen mit erreicht GROUP BY 1=1.
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 *.
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.
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 ')
Sie können Group by All verwenden, aber seien Sie vorsichtig, da Group by All aus zukünftigen Versionen von SQL Server entfernt wird.