복붙노트

[SQL] SQL 서버 - 피벗 해결 가능?

SQL

SQL 서버 - 피벗 해결 가능?

나는 온라인으로 찾을 수 놀라 울 정도로 어려웠다 충분히 간단한 문제가 있습니다. 나는에서 중지하고 사이트 내 연구와 축복이 있기 때문에 너희들을 물어보고 싶은게, 그래서 아마도 내가 부적절한 키워드를 검색하고 있습니다. 시나리오 아래를 참조하십시오 :

선택 학생 수 (*) 총 (알 수없는 변수 : BOOK1, BOOK2, book3, book4, 요법 ...)와 같은 mystudies에서.

기본적으로 모든 내가하고 싶은 총 수를 일치하는 고유의 학생증에 대한 모든 책 밖으로 목록입니다. 내가 올바른 방향으로가는 단계를 얻을 수 있도록 올바른 방향으로 누군가 포인트 나, 좋은 읽기, 또는 아무것도 수 있을까요? 나는 그것이 왼쪽 통해 수행 할 것 같은데 가입 (안 확인 X1, X2, X3 부분을 수행하는 방법) 다음 바로 피벗하지만 피벗 나타납니다에 고유의 학생 ID 번호 (중복 없음)하지만 모든 사람이 온라인으로 포인트를 두를 연결 대신 하나 개의 단일 컬럼의 컬럼에 모든 행을 넣어. SQL 서버 2005는 선택의 플랫폼입니다.

감사!

죄송합니다

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

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

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

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

나는 그래서 실제 카운트가 학생에 수행되는 변경하지 않았다 왼쪽에 조인 할 수했다 가정. 감사!

해결법

  1. ==============================

    1.SQL-서버에서 XML 경로 방법에 대한을 사용 :

    SQL-서버에서 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 방법이 여기에 작동하는 방법에 대한 자세한 설명을 제공했다. 내 대답에 추가 개선이 여기에 지적으로

    SQL 서버 바이올린

    MySQL과 SQLite는 당신이 GROUP_CONCAT 기능을 사용할 수 있습니다 :

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

    MySQL의 바이올린

    SQLite는 바이올린

    PostgreSQL을에서 당신은 ARRAY_AGG 기능을 사용할 수 있습니다 :

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

    PostgreSQL을 바이올린

    오라클에서 당신은 LISTAGG 기능을 사용할 수 있습니다

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

    오라클 SQL 바이올린

  2. from https://stackoverflow.com/questions/10791247/sql-server-possible-pivot-solution by cc-by-sa and MIT license