Program Tip

모든 열을 기준으로 SQL 그룹화

programtip 2020. 12. 5. 10:27
반응형

모든 열을 기준으로 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 키워드를 사용하는 것과 의미 상 동일합니다. 예를 들면 :

SELECT DISTINCT * FROM MyFooTable;

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

그는 테이블에서 중복 행을 찾아 표시하려고합니다.

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

이를 수행하는 간단한 방법이 있습니까?


SqlServer를 사용하는 경우 고유 한 키워드가 작동합니다. (다른 데이터베이스에 대해서는 확실하지 않음)

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

결과

a b
1 1
1 2

아니. 집계를 시도하고 있습니까? 그렇다면 필요한 것을 얻기 위해 이와 같은 것을 할 수 있습니다.

;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

이것은 근본적으로 아무것도 그룹화하지 않을 것임을 의미하기 때문입니다. 모든 열을 기준으로 그룹화하고 고유 인덱스가있는 적절하게 정의 된 테이블 SELECT * FROM table이있는 경우 기본적으로 SELECT * FROM table GROUP BY *.


전체 결과 세트에 대해 개수와 합계를 계산하고 싶었습니다. 나는 GROUP BY 1=1.


짧은 대답 : 아니요. GROUP BY 절은 본질적으로 결과를 정렬하는 방식에 순서가 필요합니다. 필드 그룹화 순서가 다르면 결과가 달라집니다.

와일드 카드를 지정하면 문이 해석 및 예측할 수없는 동작에 개방됩니다.


Group by All을 사용할 수 있지만 Group by All은 이후 버전의 SQL Server에서 제거되므로주의하십시오.


내 제안은 다음과 같습니다.

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

참고URL : https://stackoverflow.com/questions/800910/sql-grouping-by-all-the-columns

반응형