2010-08-24 6 views
0

Пожалуйста, простите меня, если раньше был дан ответ.Sql server 2000 pivot query

Я ищу несколько советов о том, как создать запрос на сводную или кросс-вкладку.

У меня есть таблица, которая выглядит любит это

Vessel Date Inspector 
A  02/05/10 Morris 
B  05/20/10 Clouseau 
A  07/25/10 Gadget 

Мне нужно, чтобы результаты были выглядеть следующим образом

Vessel Jan Feb  Mar  April May June July Aug Sept Oct Nov Dec 
    A   Morris        Gadget 
    B         Clouseau 

Хотелось бы надеяться, что имеет смысл. Я надеюсь, что кто-то может дать мне совет или помочь мне начать с этого.

Благодаря

+0

Что должно произойти, если у вас есть два инспектора в течение того же месяца и того же судна? – Timwi

+0

Думаю, они захотят получить список, разделенный запятыми. Но БА не думает, что это произойдет. – gswanson

ответ

2
Select Vessel 
    , Min (Case When Month([Date]) = 1 Then Inspector End) As Jan 
    , Min (Case When Month([Date]) = 2 Then Inspector End) As Feb 
    , Min (Case When Month([Date]) = 3 Then Inspector End) As Mar 
    ... 
    , Min (Case When Month([Date]) = 12 Then Inspector End) As Dec 
From Table 
Group By Vessel 

Вы должны статически объявить столбцы. Следует отметить, что это будет работать только один год. Если вы ищете динамическое столбцовое (месяц) поколение, то попытка сделать это в T-SQL - это не правильный подход, поскольку вы можете сделать это только с помощью некоторого динамичного SQL. Вместо этого вы должны использовать генератор отчетов или компонент среднего уровня для построения набора результатов.

0

Я не думаю, что вам нужно PIVOT для этого - просто создать 12 подзапросы, по одному на каждый месяц:

SELECT 
    Vessel, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=1) as Jan, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=2) as Feb, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=3) as Mar, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=4) as Apr, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=5) as May, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=6) as Jun, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=7) as Jul, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=8) as Aug, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=9) as Sep, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=10) as Oct, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=11) as Nov, 
    (SELECT TOP 1 Inspector FROM Stuff WHERE Vessel=Tbl.Vessel AND MONTH(Date)=12) as Dec 
FROM (
    SELECT DISTINCT(Vessel) FROM Stuff 
) Tbl 

Вы можете сделать эту работу за любой конкретный год, добавив AND YEAR(Date)=2010 (к примеру) до конца каждого из 12 подзапросов.