2012-01-13 5 views
1

여러 테이블에서 집계 함수를 사용하지 않고 PIVOT (SQL Server 2008을 실행 중입니다.)을 수행하려고합니다.여러 테이블에서 SQL 피벗 사용

CHARTER_vessels 
=============== 

vesselID vesselName 
-------- ---------- 
1   The Titanic 
2   The Pinafore 
3   The Black Pearl 


CHARTER_rateDateRange 
===================== 

rateDateRangeID  rateDateRangeName 
---------------  ----------------- 
1     Spring 2012 
2     Summer 2012 
3     Fall 2012 


CHARTER_rates 
============= 

vesselID  rateDateRangeID  rateCost 
--------  ---------------  -------- 
1   1     434 
1   2     445 
1   3     231 
2   1     675 
2   2     545 
2   3     768 
3   1     543 
3   2     654 
3   3     658 
: 나는 먼저 내가 세 개의 테이블을 가지고, 내가 여기에 내 깊이에서 조금있어 정직해야하고 난 그냥 뛰어한다 그림 그래서 문제를 정의하기 위해 고군분투하고 당신에게 내 물건 (oooeeer)를 보여

은 분명히
vesselName   Spring 2012  Summer 2012  Fall 2012 
----------   -----------  -----------  --------- 
The Titanic  434    445    231 
The Pinafore  675    545    768 
The Black Pearl 543    654    658 

내가 다른 결과 세트를 정렬 할 수 있도록하고 싶습니다 :

내가 달성하기 위해 노력하고있어 출력은 각 보트의 속도는 다음과 같이 각 시즌 열에 표시이다 가능한 경우 열!

답변

2

다음은 선박 및 날짜 범위의 고유성을 가정합니다. 이것이 사실이 아니고 피벗을 집계하고 싶지 않으면 당신을위한 것이 아닙니다. < 집계 > (rateCost)은 SQL Server 피벗을 사용하기위한 요구 사항입니다. 선박에 동일한 daterange가 여러 개있는 경우 SQL Server가 반환 할 대상을 결정하는 메커니즘이 필요합니다. 이것이 발생하지 않으면 집합체는 실제로 의미가 없습니다. 다른 옵션은 일련의 자체 조인입니다. 자기 조인 솔루션을보아야하는지 알려주세요.

SELECT src.vesselName,pvt.[Spring 2012], pvt.[Summer 2012], pvt.[Fall 2012] 
FROM 
(select vesselName, rateCost, rateDateRangeName 
from CHARTER_rateDateRange crd 
inner join CHARTER_rates cr on cr.rateDateRangeID = crd.rateDateRangeID 
inner join CHARTER_vessels cv on cv.vesselID = crd.vesselID) AS src 
PIVOT 
(
max(rateCost) 
FOR rateDateRangeName IN ([Spring 2012], [Summer 2012], [Fall 2012]) 
) AS pvt; 

아, 왜 다른 사람이이 문제를 겪고있는 경우 자체 조인 솔루션입니까? 주의는 전혀 최적화되지 않았습니다.

with joinMe as (
select vesselName, rateCost, rateDateRangeName 
from CHARTER_rateDateRange crd 
inner join CHARTER_rates cr on cr.rateDateRangeID = crd.rateDateRangeID 
inner join CHARTER_vessels cv on cv.vesselID = crd.vesselID 
) 

select a.vesselName,a.rateCost as 'Spring 2012',b.rateCost as 'Summer 2012',c.rateCost as 'Fall 2012' 
from joinMe a 
inner join joinMe b on b.vesselName= a.vesselName 
        and b.rateDateRangeName = 'Summer 2012' 
inner join joinMe c on c.cesselName = a.vesselName 
        and c.rateDateRangeName = 'Fall 2012' 
where a.rateDateRangeName = 'Spring 2012' 

크기 제한 때문에 나는 여기에 대한 쿼리 응답을 작성합니다. 다음 중 무엇이 1보다 큰 수를 가진 것을 반환합니까?

select vesselName, rateDateRangeName,count(rateCost) 
    from CHARTER_rateDateRange crd 
    inner join CHARTER_rates cr on cr.rateDateRangeID = crd.rateDateRangeID 
    inner join CHARTER_vessels cv on cv.vesselID = cr.vesselID 
group by vesselName,rateDateRangeName 
order by count(rateCost) desc 
+0

안녕 JStead, 첫째 , 둘째 구체적으로 응답하는 시간을내어 많은 감사, 두 예제와 함께 여분의 마일을 갈합니다! – Bob

+0

안녕하세요 JStead, 먼저 두 가지 예를 들어 자세히 설명하고 두 번째로 답변 해 주셔서 감사합니다. 두 번째 예를 사용하여 각 선박에 대해 두 행을 반환합니다 (두 혈관의 각 열에 올바른 가격이 표시됨). 조인 중 하나가 제공하는대로 쿼리가 작동하도록 하나의 변경을해야했습니다 오류 (나는 CHARTER_vessels AS를 cv.vesselID = crd.vesselID를 CHARTER_vessels AS cv.vesselID = cr.vesselID로 변경 함). (길이 제한으로 인해 별도의 항목으로 코드를 이동해야했습니다.) – Bob

+0

길이 제한이 너무 엄격해서 실제로 코드 샘플을 다시 붙여 넣을 수 없습니다 - 죄송합니다! 도움을 다시 주셔서 감사합니다. Bob – Bob