2012-04-25 4 views
0

XML 형식의 열이있는 테이블이 있습니다. 이 열은 레코드간에 다를 수있는 동적 속성 목록을 포함합니다.동적 목록을 통한 T-SQL GROUP BY

각 속성에 대해 별도로 테이블을 검토하지 않고 이러한 속성을 통해 GROUP BY COUNT를 (를) 사용하려고합니다.

예를 들어 한 레코드는 A, B 및 C 속성을 가질 수 있고 다른 하나는 B, C, D를 가질 수 있습니다. GROUP BY COUNT를 수행하면 A = 1, B = 2, C = 2 및 D = 1

이 작업을 수행하는 간단한 방법이 있습니까? 앤드류의 answer에 회신

편집 :이 구조의 내 지식은 피상적이다

때문에 기껏 나는 내가 원하는 것을 얻기 위해 그와 바이올린했다. 실제 코드에서는 TimeRange로 그룹화하고 이름에 따라 일부 특성 만 선택해야했습니다. 아래 실제 검색어를 붙여 넣습니다.

보조 메모 : 추가 정보를 줄이는 방법이 있습니까?

+0

사이드 노트였습니다. – user472875

+0

WHERE 조건을 WITH 쿼리로 옮길 수 있으며, 밀리 초 단위로 면도 할 수 있습니다. – Andrew

답변

1
WITH attributes AS (
    SELECT a.value('(.)[1]', 'nvarchar(max)') AS attribute 
    FROM YourTable 
    CROSS APPLY YourXMLColumn.nodes('//path/to/attributes') AS N(a) 
) 
SELECT attribute, COUNT(attribute) 
FROM attributes 
GROUP BY attribute 

테이블로 XML을 가입 할 수있는 것과 같다. 그룹 절에 xml 메서드를 사용할 수 없기 때문에 WITH가 필요합니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 아직 시도 할 시간이 없지만 매우 기대됩니다. 내가 실행하자마자 알려 드리겠습니다. – user472875

+0

귀하의 답변에 따라 제 질문을 편집했습니다. 기회가 있으면보십시오. – user472875

0

다음은 속성 데이터를 쉽게 처리하고 메인 테이블을 통과해야하는 횟수를 줄이는 방법입니다. CROSS이 적용

--create test data 
declare @tmp table (
    field1 varchar(20), 
    field2 varchar(20), 
    field3 varchar(20)) 

insert into @tmp (field1, field2, field3) 
values ('A', 'B', 'C'), 
    ('B', 'C', 'D') 

--convert the individual fields from seperate columns to one column 
declare @table table(
    field varchar(20)) 

insert into @table (field) 
select field1 from @tmp 
union all 
select field2 from @tmp 
union all 
select field3 from @tmp 

--run the group by and get the count 
select field, count(*) 
from @table 
group by field