2012-01-13 6 views
1

Я пытаюсь выполнить PIVOT (работает под управлением SQL Server 2008) на нескольких таблицах и без какой-либо совокупной функции. Я должен быть честным, я немного из моей глубины здесь, и я изо всех сил, чтобы определить проблему таким образом фигуру, я просто должен прыгать и показать вам свои вещи (oooeeer), во-первых, у меня есть три таблицы: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 

И выход я пытаюсь достичь, что ставки для каждой лодки появляются в колонке для каждого сезона, как это:

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

+0

Hi JStead, Во-первых, большое спасибо за то, что нашли время, чтобы ответить подробно, а во-вторых, за то, что вы прошли лишнюю милю с ДВАМИ примерами! Я работал со вторым примером и возвратил две строки для каждого судна (с правильной ценой в каждом столбце для обоих судов), мне пришлось сделать одно изменение, чтобы заставить запрос работать, поскольку одно из соединений давало ошибка (я изменил CHARTER_vessels AS cv ON cv.vesselID = crd.vesselID в CHARTER_vessels AS cv ON cv.vesselID = cr.vesselID). (Придется переместить код в отдельную запись из-за ограничений по длине :) – Bob

+0

Хорошо, ограничения по длине настолько строгие Я не могу на самом деле повторно вставить образец кода - извините за это! Еще раз спасибо за вашу помощь Bob – Bob

Смежные вопросы