Jump to content
CloudPT

SQL Query

Recommended Posts

CloudPT

Boas pessoal estou com um problema eu tenho uma tabela  :down:

por exemplo:

NºQuarto    Entrada        Saida

      1        01-01-2011    10-01-2011

      1        20-02-2011    22-02-2011

      2        01-02-2011    25-02-2011

Como existe um quarto repetido (o Quarto 1 segundo o exemplo)  gostava de saber se existe alguma maneira de juntar isso tudo na mesma linha. Queria que isto ficasse algo do genero por exemplo.

Nº Quarto    Entrada        Saida          Entrada        Saida

      1        01-01-2011  10-01-2011  20-02-2011  22-02-2011

         

Se alguem tiver alguma ideia ou algum comando ajude-me please  :P

Share this post


Link to post
Share on other sites
Rechousa

Pretendes retornar como uma string ou como uma tabela?

Se for numa string tens aqui como fazer:

SET NOCOUNT ON;

-- Criei uma tabela para testes
CREATE TABLE Reservas
(
Quarto INT,
Entrada DATE,
Saida DATE
);
GO

-- Esta função vai construir a mensagem de retorno
CREATE FUNCTION [dbo].[RetornaMsg]
(
@Quarto INT
)
RETURNS VARCHAR(8000)
BEGIN
DECLARE @Linha VARCHAR(8000)
SELECT @Linha=COALESCE(@Linha, 'Quarto ' + CAST(Quarto AS VARCHAR(20))) + ' Entrada: ' + CONVERT(VARCHAR(10), Entrada, 120) + ' Saída: ' + CONVERT(VARCHAR(10), Saida, 120) FROM Reservas WHERE Quarto = @Quarto
RETURN @Linha
END;
GO

-- Insere os dados para teste
INSERT INTO Reservas VALUES (1, '2011-01-01', '2011-01-10');
INSERT INTO Reservas VALUES (1, '2011-02-20', '2011-02-22');
INSERT INTO Reservas VALUES (2, '2011-02-01', '2011-02-25');

-- Esta sim é a query que precisas!
SELECT DISTINCT Quarto, dbo.RetornaMsg(Quarto) AS Msg FROM Reservas

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
CloudPT

Obrigado por teres respondido  :P

Bem devia ter dito logo isto eu estou a fazer um site em asp de um hotel com um sistema de reservas.

Tenho duas tabelas uma para os Quartos onde tenho o numero dos quartos do hotel e o tipo (ex: Duplo,Single) e o Preço

E outra com o Sistema de reservas onde tenho IDReserva, IDQuarto, Entrada, Saida.

O objectivo é ele selecionar os quartos diponiveis na GridView estou a usar o seguinte codigo

SELECT DISTINCT r.IDQuarto, q.Quarto
FROM     Reservas AS r INNER JOIN
                  Quartos AS q ON r.IDQuarto = q.Quarto
WHERE  (@Entrada NOT BETWEEN r.Entrada AND r.Saida) AND (@Saida NOT BETWEEN r.Entrada AND r.Saida)

O codigo funciona lol o problema é aquele que descrevi em cima. Vou voltar ao exemplo anterior

NºQuarto    Entrada        Saida

      1        01-01-2011    10-01-2011

      1        20-02-2011    22-02-2011

      2        01-02-2011    25-02-2011

Aqui estão duas pessoas que reservaram para o quarto 1 em datas diferentes. Agora vamos imaginar que eu queria reservar na Entrada 01-01-2011 e Saida 10-01-2011 ira aprecer o Nº Quarto 2 tudo bem e não iria reservar o quarto 1 no dia de entrada 01-01-2011 e saida 10-01-2011 tudo bem (como mostra na tabela) mas iria aparecer o Quarto 1 com entrada dia 20-02-2011 e saida 22-02-2011 mas ele está reservado certo ? Pois o Quarto é o mesmo.

Se conseguisse juntar os registos do quarto 1 talvez resulta-se. Já ando com isto á semanas nem sequer consigo dormir lol se conseguisses mudar o meu código ou dar uma ajudinha era espectacular.

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Imaginando que estás a utilizar campos do Tipo DateTime para a Entrada e Saída, penso ser esta a solução para conseguires dormir :P

SET NOCOUNT ON

DECLARE @Quartos TABLE
(
idQuarto INT IDENTITY(1, 1),
Descricao VARCHAR(20)
)

DECLARE @Reservas TABLE
(
idReserva INT IDENTITY(1, 1),
idQuarto INT,
Entrada DATETIME,
Saida DATETIME
)

INSERT INTO @Quartos VALUES ('Quarto 1')
INSERT INTO @Quartos VALUES ('Quarto 2')
INSERT INTO @Quartos VALUES ('Quarto 3')

INSERT INTO @Reservas VALUES (1, '2011-01-01 14:00:00', '2011-01-10 12:00:00')
INSERT INTO @Reservas VALUES (1, '2011-02-20 14:00:00', '2011-02-22 12:00:00')
INSERT INTO @Reservas VALUES (2, '2011-02-01 14:00:00', '2011-02-25 12:00:00')

DECLARE @DataEntrada DATETIME = '2011-02-25 14:00:00'
DECLARE @DataSaida DATETIME = '2011-02-26 12:00:00'

-- Quartos Livres:
SELECT * FROM @Quartos
WHERE idQuarto NOT IN
(
SELECT idQuarto FROM @Reservas R
	WHERE  (r.Entrada BETWEEN @DataEntrada AND @DataSaida) OR (r.Saida BETWEEN @DataEntrada AND @DataSaida) OR (@DataEntrada BETWEEN R.Entrada AND R.Saida AND @DataSaida BETWEEN R.Entrada AND R.Saida)
)

Experimenta lá e depois diz qq coisa.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
CloudPT

Muito Obrigado mas só falta um pequeno promenor  :P

Por exemplo se Entrada = 2011-01-10 e a saida 2011-01-11 Então uma outra pessoa pode reservar para o dia de entrada 2011-01-11 porque a outra sai no dia 11 como ao contrario uma pessoa pode reservar para o dia 2011-01-09 até 2011-01-10.

Se não for possivel não faz mal lol. Graças a ti já está muito bom e já posso avançar no projecto é que eu nunca aprendi SQL :P .                                                P.S.Devias de ir para presidente lol  :cheesygrin:

Share this post


Link to post
Share on other sites
Rechousa

Por exemplo se Entrada = 2011-01-10 e a saida 2011-01-11 Então uma outra pessoa pode reservar para o dia de entrada 2011-01-11 porque a outra sai no dia 11 como ao contrario uma pessoa pode reservar para o dia 2011-01-09 até 2011-01-10.

Pois é! Aí está o pormenor das horas.

Pronto, usas apenas datas, certo?

Então aqui vai a nova Query:

SET NOCOUNT ON

DECLARE @Quartos TABLE
(
idQuarto INT IDENTITY(1, 1),
Descricao VARCHAR(20)
)

DECLARE @Reservas TABLE
(
idReserva INT IDENTITY(1, 1),
idQuarto INT,
Entrada DATE,
Saida DATE
)

INSERT INTO @Reservas VALUES (1, '2011-01-01', '2011-01-10')
INSERT INTO @Reservas VALUES (1, '2011-02-20', '2011-02-22')
INSERT INTO @Reservas VALUES (2, '2011-02-01', '2011-02-25')

DECLARE @DataEntrada DATETIME = '2011-02-25'
DECLARE @DataSaida DATETIME = '2011-02-26'

-- Quartos Livres:
SELECT * FROM @Quartos
WHERE idQuarto NOT IN
(
SELECT idQuarto FROM @Reservas R
	WHERE (R.Entrada >= @DataEntrada AND R.Entrada < @DataSaida) OR (R.Saida > @DataEntrada AND r.Saida <= @DataSaida) OR (@DataEntrada BETWEEN R.Entrada AND R.Saida AND @DataSaida BETWEEN R.Entrada AND R.Saida)
)


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
CloudPT

Funciona perfeitamente Muito Obrigado  :thumbsup:

Só uma coisa lol se o cliente quise-se escolher por exempo o quarto pelo tipo Single ou Double podia por do tipo

SELECT * FROM @Quartos
WHERE idQuarto NOT IN
(
        SELECT idQuarto FROM @Reservas R
                WHERE (R.Entrada >= @DataEntrada AND R.Entrada < @DataSaida) OR (R.Saida > @DataEntrada AND r.Saida <= @DataSaida) OR (@DataEntrada BETWEEN R.Entrada AND R.Saida AND @DataSaida BETWEEN R.Entrada AND R.Saida)
) AND (Tipo = @Tipo) 

Achas que trabalha sem problemas ?

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Sim, parece-me que é mesmo isso que precisas! A query "interior" estás apenas a apresentar os quartos que têm disponibilidade, enquanto que na query "exterior" filtras pelo seu tipo.

Sim, julgo que funciona.  :thumbsup:


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
CloudPT

Muito Obrigado :confused: .

Se precisar de alguma ajuda aviso  ;).

Continua a programar  :thumbsup:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.