Digamos que eu tenha a Tabela A: BookingsPerPerson
Person_Id ArrivalDate DepartureDate
123456 2012-01-01 2012-01-04
213415 2012-01-02 2012-01-07
O que eu preciso alcançar com uma visão é o seguinte:
Person_Id ArrivalDate DepartureDate Jan-01 Jan-02 Jan-03 Jan-04 Jan-05 Jan-06 Jan-07
123456 2012-01-01 2012-01-04 1 1 1 1
213415 2012-01-02 2012-01-07 1 1 1 1 1 1
O sistema é para eventos, então cada reserva de hotel pode levar de 1 a 15 dias, mas não mais que isso. Todas as idéias seriam muito apreciadas.
Você pode usar a
PIVOT
função para realizar esta consulta. Minha resposta incluirá uma versão estática e dinâmica, porque às vezes é mais fácil entendê-la usando uma versão estática.Um Pivô Estático é quando você codifica todos os valores que deseja transformar em colunas.
Resultados (consulte SQL Fiddle With Demo ):
A versão dinâmica irá gerar a lista de valores para transformar em colunas:
Os resultados são os mesmos (veja SQL Fiddle With Demo ):
Eu sou da velha escola, e acho
CASE
mais fácil trabalhar na minha cabeça do quePIVOT
. Tenho certeza de que o bluefeet aparecerá em breve e me deixará envergonhado, mas enquanto isso você pode brincar com essa consulta SQL dinâmica. Assumindo que sua mesa armazenaDATE
e nãoDATETIME
(ou pior ainda,VARCHAR
):Um dos poucos casos, BTW, onde eu poderia justificar o uso
BETWEEN
de consultas de intervalo de datas.Que tal isso para gerar uma lista de datas