2012-01-13 23 views
1

複数のテーブル間で集計関数を使用しないでPIVOT(SQL Server 2008を実行しています)を実行しようとしています。SQL PIVOTを複数のテーブルにまたがる

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 
:私は、最初に、私は3つのテーブルを持って、私はちょうどでジャンプして、あなたに私のもの(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ピボットを使用するための要件です。ある船舶に同じデータ距離の複数がある場合、SQL Serverが何を返すかを決定する仕組みが必要です。これが起こらなければ、集計は実際には無意味です。もう1つのオプションは、一連の自己結合です。あなたが自己結合ソリューションを見なければならないかどうか教えてください。

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、 まず、2つの例で余分に行くために、詳細に応答する時間をとってくれてありがとう! 私は2番目の例を使用していましたが、すべての船舶に対して2つの行が返されています(両方の船舶のそれぞれの列に正しい価格が設定されています)。エラー(CHARTER_vessels AS cvをcv.vesselID = crd.vesselIDをCHARTER_vessels AS cv.vesselID = cr.vesselIDに変更しました)。 (長さの制限のため別のエントリにコードを移動しなければならなかった) – Bob

+0

長さの制限が厳しいため、実際にはコードサンプルを再貼り付けできません。 もう一度お返事ありがとうございます Bob – Bob

関連する問題