2010-01-31 5 views
11

나는이 보이는 테이블이 있습니다결과 열 이름을 모른 채 SQL Server 피벗을 사용할 수 있습니까?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

을 그리고 내가 좋아하는, 각 사이트의 한 달 동안 나에게 "발"을 제공하는 2 차원 테이블을 얻으려면 :

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

그러나 캐치는, 나는 "위치"에있을 수있는 가능한 모든 가치를 모른다. 새 사이트가 나타나면 결과 테이블에 새 열을 자동으로 가져 오려고합니다.

내가 할 수있는 모든 코드 샘플은 쿼리 텍스트에 "Microsoft와 Google"을 하드 코딩해야했습니다.
I saw one that didn't 그러나 기본적으로 사이트를 나열하고 해당 열 이름이 포함 된 즉석에서 쿼리를 생성하여 문자열을 연결합니다.

이렇게 해킹하지 않고도 SQL Server 2008을 실행할 수있는 방법이 없습니까?

참고 :이 쿼리를 ASP.Net에서 보내는 쿼리로 실행할 수 있어야합니다. 저장 프로 시저 또는 이와 유사한 기타 작업을 수행 할 수 없습니다.

감사합니다.
다니엘

+0

무엇 당신은'exec (@sql)'을 사용하여 런타임에 질의를 실행함으로써 가능한 것이어야한다고 생각했습니다. [here] (http://stackoverflow.com/questions/15752112/)를보십시오. – surfmuggle

답변

6

동적 SQL을 사용하는 예제입니다. 불행히도 출력 열을 미리 알지 못하면 SQL Server에서 피벗을 수행 할 수있는 기본 제공 방법이 없습니다.

데이터가 너무 크지 않은 경우 ASP.NET에서 정상적인 행 쿼리를 실행하고 응용 프로그램 코드에서 피벗을 수행하는 것이 가장 쉽습니다. 데이터가 매우 큰 경우 먼저 가능한 열 값을 쿼리 한 후 SQL을 동적으로 생성해야합니다.

실제로 동적 SQL을 생성하는 SQL 문을 작성할 필요는 없습니다. 당신은 ASP.NET에서 단순히 SQL을 생성 할 수 있으며, 그럴 가능성이 훨씬 더 큽니다. 생성 된 쿼리에서 특수 문자 Site 값을 제거하기 전에 값을 이스케이프 처리하는 것을 잊지 말고 평상시에 SQL 문에서 일반적으로 사용하는 부분을 매개 변수화하는 것을 잊지 마십시오.

-1

선택 달 '(발 끝을 google'then 월별로 그룹 withoutpivot에서 구글, 분 (마이크로 소프트, 분의 경우 사이트) microsoft'then 발 끝이 경우 사이트)'

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google' 
관련 문제