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