[SQL] SQL 서버 - 피벗 해결 가능?
SQLSQL 서버 - 피벗 해결 가능?
나는 온라인으로 찾을 수 놀라 울 정도로 어려웠다 충분히 간단한 문제가 있습니다. 나는에서 중지하고 사이트 내 연구와 축복이 있기 때문에 너희들을 물어보고 싶은게, 그래서 아마도 내가 부적절한 키워드를 검색하고 있습니다. 시나리오 아래를 참조하십시오 :
선택 학생 수 (*) 총 (알 수없는 변수 : 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.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 바이올린
from https://stackoverflow.com/questions/10791247/sql-server-possible-pivot-solution by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 문자열 집계 (0) | 2020.06.17 |
---|---|
[SQL] 어떻게 테이블의 컬럼이 고정되어 있지 스키마를 설계 할 수 (0) | 2020.06.17 |
[SQL] 컬럼의 값에 따라 오라클 쿼리의 결과를 전개하는 방법 (0) | 2020.06.17 |
[SQL] 직교 제품에 SQL 쿼리 리드에서 UDF를 사용하는 이유는 무엇입니까? (0) | 2020.06.17 |
[SQL] 함수에서 쿼리를 반환? (0) | 2020.06.17 |