SQL按所有列分组
有什么办法可以将一个表的所有列分组而不指定列名? 喜欢:
select * from table group by *
DISTINCT关键字
我相信你想要做的是:
SELECT DISTINCT * FROM MyFooTable;
如果按所有列进行分组,则只是要求删除重复的数据。
例如,包含以下数据的表格:
id | value ----+---------------- 1 | foo 2 | bar 1 | foo 3 | something else
如果您执行以下查询,它基本上与SELECT * FROM MyFooTable GROUP BY *
相同,如果您假设*表示所有列:
SELECT * FROM MyFooTable GROUP BY id, value;
id | value ----+---------------- 1 | foo 3 | something else 2 | bar
它删除所有重复的值,基本上使得它在语义上与使用DISTINCT关键字相同,除了结果sorting之外。 例如:
SELECT DISTINCT * FROM MyFooTable;
id | value ----+---------------- 1 | foo 2 | bar 3 | something else
如果你使用SqlServer,distinct关键字应该适合你。 (不知道其他数据库)
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
结果是
ab 1 1 1 2
他正在尝试查找并在表格中显示重复的行。
SELECT *, COUNT(*) AS NoOfOccurrences FROM TableName GROUP BY * HAVING COUNT(*) > 1
我们有一个简单的方法来完成这个吗?
不,因为这从根本上意味着你不会分组任何东西。 如果按照所有列进行分组(并且具有正确定义的表,并具有唯一索引),那么SELECT * FROM table
基本上与SELECT * FROM table GROUP BY *
。
不。 你想要做一些聚合吗? 如果是这样,你可以做这样的事情来得到你所需要的
;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
简短的回答:不。 GROUP BY子句本质上要求他们安排你的结果的方式。 字段分组的顺序不同会导致不同的结果。
指定一个通配符会使语句对解释和不可预知的行为开放。
您可以使用Group by All,但要小心,因为Group by All将从SQL Server的未来版本中删除。
我想做完整的结果集计数和总和。 我通过GROUP BY 1=1
实现了所有分组。
这是我的build议:
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 ')