SQL PIVOT ON для нескольких таблиц - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь сделать 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 Ответ

2 голосов
/ 13 января 2012

Ниже приводится предположение об уникальности судна и диапазоне дат.Если это не так, и вы не хотите объединять сводку, это не для вас. (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...