none
Recuperar resultados com várias condições RRS feed

  • Pergunta

  • Bom dia!

    Estou precisando recuperar resultados com determinadas condições. Vou tentar explicar:

    Em uma tabela, são armazenadas planilhas de configurações de um determinado objeto. Essas planilhas têm vigência determinada e sofrem versionamento quando é incluída uma nova planilha para o mesmo objeto. Ex.:


     id  |             objeto              | dt_ini_vig_plan | situacao_planilha
    ------------------------------------------------------------------------------
     1   |  caixa de ferramentas  |    01/01/2013   |    obsoleta
    -----------------------------------------------------------------------------
     2   |  caixa de ferramentas  |    01/06/2013   |      vigente



    Acontece que eu posso agregar acessórios a esses objetos, mas eles também têm um fluxo próprio. Então eu tenho outra tabela para armazená-los:



     id_acc  |      acessorio      | dt_ini_vig_acc  | situacao_acc
    -------------------------------------------------------------------------
         1     |  chave de fenda  |   01/12/2012   |   obsoleta
    -------------------------------------------------------------------------
         2     |  chave de fenda  |   01/03/2013   |   vigente


    A relação entre esses objetos se dá apenas pelas datas de vigência. Preciso encontrar os acessórios que estejam vigentes no mesmo período em que as planilhas estiverem vigentes. Mais ou menos assim:

    Se 
      situacao_planilha = vigente
    e
      situacao_acc = vigente
    e
     dt_ini_vig_acc <= dt_ini_vig_plan


    É só uma consulta, mesmo, para seleção de registros no SQL Server. Alguém pode me ajudar? Não tenho muita prática com SQL, por isso, quando se trata de consultas um pouco mais complicadas, fico travada.
    quarta-feira, 17 de julho de 2013 14:55

Respostas

  • Certo então veja se isso lhe atende ,senão vamos tentando até ficar certo :

    Segue esse código:

    DECLARE @tblFerramenta AS TABLE(
    								id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    								objeto VARCHAR(200) , 
    								dt_ini_vig_plan DATETIME,
    								situacao_planilha CHAR(1)
    								)
    								
    DECLARE @tblAcessorio  AS TABLE(
    							     id_acc INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    								 acessorio VARCHAR(200) , 
    								 dt_ini_vig_acc DATETIME, 
    								 situacao_acc CHAR(1)
    								 )
    
    
    INSERT 	@tblFerramenta VALUES('caixa de ferramentas 1','01-01-2013','O'),
    						     ('caixa de ferramentas 1','01-06-2013','V'),
    						     ('caixa de ferramentas 1','01-08-2013','V');
    						     
    INSERT 	@tblAcessorio VALUES('chave de fenda 1','01-12-2012','O'),
    							('chave de fenda 1','03-01-2013','V'),
    							('chave de fenda 1','03-07-2013','V');						
    
    
    
    SELECT A.* FROM @tblAcessorio A
    WHERE A.situacao_acc = 'V' AND 
    A.dt_ini_vig_acc BETWEEN (SELECT MIN(dt_ini_vig_plan) FROM @tblFerramenta
    								WHERE situacao_planilha = 'V') AND 
    						( SELECT MAX(dt_ini_vig_plan) FROM @tblFerramenta
    							    WHERE situacao_planilha = 'V' )		

    No meu caso o V é vigente e o O e obsoleto.

    Aguardo retorno e se for util marque como resposta.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    quinta-feira, 18 de julho de 2013 12:59

Todas as Respostas

  • Tente isso :

    SELECT A.* FROM Acessorio A
    INNER JOIN (SELECT dt_ini_vig_acc FROM Ferramenta 
    WHERE situacao_acc = 'vigente') F ON (F.dt_ini_vig_acc = A.dt_ini_vig_acc)
    
    WHERE A.situacao = 'vigente'


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    quarta-feira, 17 de julho de 2013 15:03
  • Olá, Davi!

    Primeiramente, obrigada por responder.

    Esta solução que você propôs não atende neste caso, porque não posso fazer uma comparação de igualdade... na verdade, o que eu preciso saber é se o período em que o acessório está vigente corresponde ao período de vigência da planilha, ou seja, mesmo que o início da vigência não seja o mesmo, se em algum momento ela coincidir, vai estar certo.

    No exemplo que eu dei, coloquei o início da vigência do acessório anterior à data de vigência da planilha. Neste caso, este acessório deveria vir como resultado, uma vez que no período em que a planilha estava vigente, o acessório também estava.


    Então, o que eu preciso é verificar se tem alguma planilha com a vigência coincidente com a do acessório e, caso houver, retornar o acessório como resultado - mas tem que fazer isso para cada acessório que corresponder à condição passada...
    quarta-feira, 17 de julho de 2013 17:26
  • Certo então veja se isso lhe atende ,senão vamos tentando até ficar certo :

    Segue esse código:

    DECLARE @tblFerramenta AS TABLE(
    								id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    								objeto VARCHAR(200) , 
    								dt_ini_vig_plan DATETIME,
    								situacao_planilha CHAR(1)
    								)
    								
    DECLARE @tblAcessorio  AS TABLE(
    							     id_acc INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    								 acessorio VARCHAR(200) , 
    								 dt_ini_vig_acc DATETIME, 
    								 situacao_acc CHAR(1)
    								 )
    
    
    INSERT 	@tblFerramenta VALUES('caixa de ferramentas 1','01-01-2013','O'),
    						     ('caixa de ferramentas 1','01-06-2013','V'),
    						     ('caixa de ferramentas 1','01-08-2013','V');
    						     
    INSERT 	@tblAcessorio VALUES('chave de fenda 1','01-12-2012','O'),
    							('chave de fenda 1','03-01-2013','V'),
    							('chave de fenda 1','03-07-2013','V');						
    
    
    
    SELECT A.* FROM @tblAcessorio A
    WHERE A.situacao_acc = 'V' AND 
    A.dt_ini_vig_acc BETWEEN (SELECT MIN(dt_ini_vig_plan) FROM @tblFerramenta
    								WHERE situacao_planilha = 'V') AND 
    						( SELECT MAX(dt_ini_vig_plan) FROM @tblFerramenta
    							    WHERE situacao_planilha = 'V' )		

    No meu caso o V é vigente e o O e obsoleto.

    Aguardo retorno e se for util marque como resposta.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    quinta-feira, 18 de julho de 2013 12:59
  • Davi,

    não era exatamente isso, mas agora já me deu uma clareada. Muito obrigada!


    quinta-feira, 18 de julho de 2013 17:14