2012-05-28 2 views
1

나는 온라인으로 찾기가 놀랍도록 어려운 문제를 가지고 있습니다. 아마도 내가 부적절한 키워드로 검색하고 있으므로 귀하의 사이트가 내 연구를 통해 축복을 받았기 때문에 들러서 물어보고 싶었을 것입니다. 아래 시나리오를 참조하십시오 :SQL Server - 가능한 피벗 솔루션?

학생을 선택하고 합계 (미지 변수 : book1, book2, book3, book4 등)를 미스테리에서 선택하십시오.

본질적으로 제가하고 싶은 것은 합계 수와 일치하는 고유 한 학생 ID에 대한 모든 도서를 나열하는 것입니다. 누군가 올바른 방향, 좋은 읽기 또는 다른 방향으로 나를 가리킬 수 있었습니까? 올바른 방향으로 나아갈 수 있습니까? 나는 왼쪽 조인을 통해 (x1, x2, x3 부분을 수행하는 방법을 모르는 경우) 수행 한 다음 고유 한 학생 ID 번호 (중복 없음)로 두 링크를 연결하지만 모든 온라인 포인트가 피벗하지만 피벗이 나타나는 것으로 가정합니다. 모든 행을 단일 열 대신에 열에 넣는 것. SQL 서버 2005는 선택의 플랫폼입니다.

감사합니다.

죄송합니다

다음 쿼리는 테이블의 모든 중복 항목을 내 고유 ID (학생) 학생의 수를 생성합니다

select student, count(*) as Total 
from mystudies 
group by student order by total desc 

내가 모르는 부분은 만드는 방법입니다 왼쪽 테이블 고유 ID에 가입 (boookid)

select mystudies1.student, mystudies1.total, mystudies2.bookid 
from ( select student, count(*) as Total 
     from mystudies 
     group by student 
    ) mystudies1 
     left join 
     ( select student, bookid 
     from mystudies 
    ) mystudies2 
     on mystudies1.student=mystudies2.student 
order by mystudies1.total desc, mystudies1.student asc 

물론 위의 행은 다음과 같은 결과를 얻을 수 :

Student Total BookID 
000001 3  100001 
000001 3  100002 
000001 3  100003 
000002 2  200001 
000002 2  200002 
000003 1  300001 

그러나 실제로 원하는 것은 다음과 유사한은 다음과 같습니다

Student Total BookID 
000001  3  100001, 100002, 100003 
000002  2  200001, 200002 
000003  1  300001 

나는 왼쪽에서 수행되어야했다가되고 실제 수를 변경하지 않았다 그래서 가입 가정 학생에게 수행. 감사! SQL-서버에서

+0

일부 샘플 데이터를 게시 한 다음 원하는 결과를 게시해야합니다. – Taryn

+0

모든 필드를 연결하려는 것처럼 들립니다. 이것은 문자열 집계 연결 함수입니다. 그리고, 어떻게 이것을하는지는 데이터베이스에 따라 많이 다릅니다. 이 아이디어를 검색하여 원하는 것을 얻을 수 있습니다. –

+0

귀하의 질문은 매우 설화입니다. 예제 데이터 세트, 지금까지 시도한 SQL 및 예상되는 결과를 사용하여 다시 말해보십시오. –

답변

3

는 XML 경로 방법에 대한 사용

SELECT Student, 
     Total, 
     STUFF((SELECT ', ' + BookID 
       FROM MyStudies books 
       WHERE Books.Student = MyStudies.Student 
       FOR XML PATH(''), TYPE 
       ).value('.', 'VARCHAR(MAX)'), 1, 2, '') AS Books 
FROM ( SELECT Student, COUNT(*) AS Total 
      FROM myStudies 
      GROUP BY Student 
     ) MyStudies 

내가 이전에 XML의 PATH 방법이 here를 작동하는 방법에 대한 자세한 설명 주었다.

SELECT Student, 
     COUNT(*) AS Total, 
     GROUP_CONCAT(BookID) AS Books 
FROM myStudies 
GROUP BY Student 

MySQL Fiddle

SQLite Fiddle

: 내 대답에 추가 개선이 MySQL과 SQLite는에 here

SQL Server Fiddle


을 지적 사용하면 GROUP_CONCAT 기능을 사용할 수 있습니다 오라클에서

SELECT Student, 
     COUNT(*) AS Total, 
     ARRAY_AGG(BookID) AS Books 
FROM myStudies 
GROUP BY Student 

Postgresql Fiddle


당신이 LISTAGG 기능

SELECT Student, 
     COUNT(*) AS Total, 
     LISTAGG(BookID, ', ') WITHIN GROUP (ORDER BY BookID) AS Books 
FROM myStudies 
GROUP BY Student 

Oracle SQL Fiddle

을 사용할 수 있습니다 : 691,363,210
는 PostgreSQL을에

당신은 ARRAY_AGG 기능을 사용할 수 있습니다


+0

감사합니다. Gordon의 주장을 읽은 후에 게시 된 XML Path Method와 유사한 접근법을 사용하여 재귀 적 cte를 통해 효율적인 솔루션을 찾을 수있었습니다. 그것이 나에게 몇 시간의 Google 시간을 절약했기 때문에 올바른 방향으로 밀어 줘서 고마워. – TStewartFan