我正在尝试跨多个表执行PIVOT(运行SQL Server 2008)并且不涉及聚合函数。我必须说实话,我有点超出我的深度,我正在努力定义问题所以我应该跳进去向你展示我的东西(oooeeer),首先我有三张桌子:
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
显然,如果可能,我希望能够对不同列的结果集进行排序!
答案 0 :(得分:2)
下面假设船只和日期范围的唯一性。如果这不是真的,你不想聚合枢轴不适合你。 < aggregate>(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