이 테이블을 가정합니다여러 개의 열을 그룹으로 연결하는 방법은 무엇입니까?
PruchaseID | Customer | Product | Method
-----------|----------|----------|--------
1 | John | Computer | Credit
2 | John | Mouse | Cash
3 | Will | Computer | Credit
4 | Will | Mouse | Cash
5 | Will | Speaker | Cash
6 | Todd | Computer | Credit
나는 각 그들이 무엇을 구입의 고객 및 결제 수단에 대한 보고서를 생성합니다.
는하지만 해당 보고서는 다음과 같은 고객 당 하나의 행,되고 싶은 :
Customer | Products | Methods
---------|--------------------------|--------------
John | Computer, Mouse | Credit, Cash
Will | Computer, Mouse, Speaker | Credit, Cash
Todd | Computer | Credit
지금까지 발견 등의 XML PATH
방법을 사용하여 그룹 연결하는 것입니다했습니다 무엇 :
SELECT
p.Customer,
STUFF(
SELECT ', ' + xp.Product
FROM Purchases xp
WHERE xp.Customer = p.Customer
FOR XML PATH('')), 1, 1, '') AS Products,
STUFF(
SELECT ', ' + xp.Method
FROM Purchases xp
WHERE xp.Customer = p.Customer
FOR XML PATH('')), 1, 1, '') AS Methods
FROM Purchases
이것은 나에게 결과를 주지만 내 관심사는 이것의 속도이다.
언뜻보기에는 세 가지 다른 선택이 여기에 있습니다. 두 개는 각각 구매 항목의 행 수를 곱합니다. 결국 이것은 expenentially 느려질 것입니다.
그래서 더 나은 성능으로 이것을 수행 할 수있는 방법이 있습니까?
집계에 더 많은 열을 추가하고 싶습니다. 모든 열에 대해 STUFF() 블록을 사용해야합니까? 그것은 나를 위해 충분히 빨리 들리지 않습니다.
Siggestions?
데이터를 비정규 화하여 성능이 잠재적 인 문제가 될 수 있습니다. XML 메서드는 데이터를 구분 된 목록으로 역 정규화하는 가장 좋은 방법입니다. –
'for xml path'를 사용할 때 조심하십시오. 데이터에 예를 들어'&'가 있으면 놀라실 것입니다. Aaron Bertrand는 체크 아웃 할 수있는 여러 가지 방법 중 [비교] (http://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation)를 만들었습니다. –