SQL PIVOT ON跨多个表

时间:2012-01-13 02:54:02

标签: sql sql-server pivot

我正在尝试跨多个表执行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

显然,如果可能,我希望能够对不同列的结果集进行排序!

1 个答案:

答案 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