with transact excluir ejemplos consultas consulta columna sql

excluir - transact sql group by having



AgrupaciĆ³n de SQL por todas las columnas. (9)

Él está tratando de encontrar y mostrar las filas duplicadas en una tabla.

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

¿Tenemos una forma sencilla de lograr esto?

¿Hay alguna forma de agrupar por todas las columnas de una tabla sin especificar los nombres de las columnas? Me gusta:

select * from table group by *


Aquí está mi sugerencia:

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 '')


No, porque esto significa fundamentalmente que no estarás agrupando nada. Si se agrupa por todas las columnas (y tiene una tabla correctamente definida con un índice único), la SELECT * FROM table es esencialmente lo mismo que la SELECT * FROM table GROUP BY * .


Puede usar Agrupar por todos, pero tenga cuidado ya que Agrupar por todos se eliminará de las futuras versiones del servidor SQL.


Quería hacer cuentas y sumas sobre el conjunto completo de resultados. Logré agrupar por todos con GROUP BY 1=1 .


Respuesta corta: no. Las cláusulas de GROUP BY requieren intrínsecamente un orden en la forma en que organizan sus resultados. Un orden diferente de agrupaciones de campo llevaría a resultados diferentes.

Especificar un comodín dejaría la declaración abierta a interpretación y comportamiento impredecible.


Si está utilizando SqlServer, la palabra clave distinta debería funcionar para usted. (No estoy seguro acerca de otras bases de datos)

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

resultados en

a b 1 1 1 2


nop ¿Estás tratando de hacer alguna agregación? Si es así, podrías hacer algo como esto para obtener lo que necesitas

;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


La palabra clave DISTINCT


Creo que lo que estás tratando de hacer es:

SELECT DISTINCT * FROM MyFooTable;

Si agrupa por todas las columnas, solo está solicitando que se eliminen los datos duplicados.

Por ejemplo una tabla con los siguientes datos:

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

Si realiza la siguiente consulta, que es esencialmente lo mismo que SELECT * FROM MyFooTable GROUP BY * si está asumiendo que * significa todas las columnas:

SELECT * FROM MyFooTable GROUP BY id, value;

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

Elimina todos los valores duplicados, lo que esencialmente lo hace semánticamente idéntico al uso de la palabra clave DISTINCT con la excepción del orden de los resultados. Por ejemplo:

SELECT DISTINCT * FROM MyFooTable;

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