2012-01-13 29 views
1

我想跨多個表做一個PIVOT(我正在運行SQL Server 2008),並且沒有涉及聚合函數。我必須說實話我有點在這裏我的深度和我在努力定義問題,所以數字我應該只是跳,並告訴你我的東西(oooeeer),首先我有三個表:跨多個表的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 

而我試圖達到的輸出是每個船的費率出現在列每個賽季,就像這樣:

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數據透視表的要求。如果船隻有多個相同的日期範圍,則需要有一個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 2012-01-13 13:29:06

+0

嗨JStead, 首先,非常感謝您花時間做出詳細的回覆,其次感謝您爲此付出更多的努力! 我與第二個例子一起工作,它爲每艘船舶返回兩行(每艘船的每列都有正確的價格),但我必須做一次更改才能使查詢工作,因爲其中一個連接正在給予一個錯誤(我將CHARTER_vessels AS cv ON cv.vesselID = crd.vesselID更改爲CHARTER_vessels AS cv ON cv.vesselID = cr.vesselID)。 (由於長度限制,不得不將代碼移動到單獨的條目:) – Bob 2012-01-13 13:37:11

+0

好吧,長度限制非常嚴格,我實際上無法重新粘貼代碼示例 - 對此感到抱歉! 再次感謝您的幫助 Bob – Bob 2012-01-13 13:38:41