locked
Como montar essa Query? RRS feed

  • Pergunta

  • preciso retornar um UNICO preço dependendo do tipo do cliente.
    São 3 tipos de clientes: CLIENTE, DISTRIBUIDOR, ATACADO
    este cliente pode ou não estar vinculado a uma tabela de preços. Se estiver vinculado a uma tabela de preços é feito a consulta e retorna o preço adequado ao cliente: PrecoVenda, PrecoAtacado, PrecoDistribuidor.
    Se o cliente não possui tabela de preços, então consulta na tabela de produtos que contem os mesmos campos de preçoes acima.

    Colocarei somente os campos que interessa.
    Tabelas:

    TABELAPRODUTO(TABELA NVARCHAR(5),
                            CodProd NCHAR(13),
                            PrecoVenda MONEY,
                            PrecoAtacado MONEY,
                            PrecoDistribuidor MONEY)

    PRODUTOS(CODPROD NCHAR(13),
                    PrecoVenda MONEY,
                    PrecoAtacado MONEY,
                    PrecoDistribuidor MONEY,
                    CODTABELA NVARCHAR(5))

    CLIENTES(CODCLI,
                  RAZAOSOCIAL NVARCHAR(40),
                  TIPO NVARCHAR(20),
                  CODTABELA NVARCHAR(5))

    segunda-feira, 21 de setembro de 2009 16:36

Respostas

  • JrCesar,

       Você pode montar o seu select desta forma:

    select tabela, tipo,
    case 
    	when tabela is null then (	select	case cliente.TIPO
    										when 'ATACADO' then PRECOATACADO
    										when 'CLIENTE' then PRECOVENDA
    										when 'DISTRIBUIDOR' then PRECODISTRIBUIDOR
    										else null end as preco 
    								from produtos
    								where CODPROD = @CODPROD
    								)
    	when tabela is not null then (	select	case cliente.TIPO
    											when 'ATACADO' then PRECOATACADO
    											when 'CLIENTE' then PRECOVENDA
    											when 'DISTRIBUIDOR' then PRECODISTRIBUIDOR
    											else null end as preco 
    									from TABELAPRODUTO 
    									WHERE CODPROD = @CODPROD 
    									 AND TABELAPRODUTO.TABELA = CLIENTE.TABELA)
    FROM CLIENTES 
    WHERE CODCLI = @CODCLI

    Carlos Eduardo Pieren - MCP
    • Sugerido como Resposta Carlos Eduardo Pieren terça-feira, 22 de setembro de 2009 18:24
    • Marcado como Resposta JrCesar quarta-feira, 23 de setembro de 2009 16:05
    terça-feira, 22 de setembro de 2009 18:24

Todas as Respostas

  • Boa tarde

    Até mesmo pela questao de manter a integridade referencial das tabelas do seu banco de dados, a melhor solução seria você associar o seu cliente a uma tabela DEFAULT, a partir daí basta você fazer um JOIN


    Select  Produtos.PrecoVenda,Produtos.PrecoAtacado,Produtos.PrecoDistribuidor
    From TabelaProduto
    Inner Join Clientes On Clientes.CodTabela = Produtos.CodTabela
    Inner Join Produtos.Produtos.CodTabela = Produtos.CodTabela



    Espero ter ajudado
    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    segunda-feira, 21 de setembro de 2009 16:52
  • olá anderson, tudo bem?
    na verdade a ideia é mais ou menos essa:

    DECLARE @PRECO MONEY
    SELECT TABELA, TIPO FROM CLIENTES WHERE CODCLI = @CODCLI
    IF ISNULL(TABELA) THEN
          CASE TIPO='ATACADO' 
                @PRECO = SELECT PRECOATACADO FROM PRODUTOS  WHERE CODPROD = @CODPROD
          CASE TIPO='CLIENTE' 
                @PRECO = SELECT PRECOVENDA FROM PRODUTOS  WHERE CODPROD = @CODPROD
          CASE TIPO='DISTRIBUIDOR' 
                @PRECO = SELECT PRECODISTRIBUIDOR FROM PRODUTOS  WHERE CODPROD = @CODPROD
    ELSE
          CASE TIPO='ATACADO' 
                @PRECO = SELECT PRECOATACADO FROM TABELAPRODUTO  WHERE CODPROD = @CODPROD AND TABELAPRODUTO.TABELA = CLIENTE.TABELA
          CASE TIPO='CLIENTE' 
                @PRECO = SELECT PRECOVENDA FROM TABELAPRODUTO  WHERE CODPROD = @CODPROD AND TABELAPRODUTO.TABELA = CLIENTE.TABELA
          CASE TIPO='DISTRIBUIDOR' 
                @PRECO = SELECT PRECODISTRIBUIDOR FROM TABELAPRODUTO  WHERE CODPROD = @CODPROD AND TABELAPRODUTO.TABELA = CLIENTE.TABELA
    END



    Eu sei que a sintaxe esta completamente errada, mas é mais ou menos essa a ideia. Se voce puder me ajudar na sintaxe ficaria muito grato.

    segunda-feira, 21 de setembro de 2009 20:22
  • JrCesar,

       Você pode montar o seu select desta forma:

    select tabela, tipo,
    case 
    	when tabela is null then (	select	case cliente.TIPO
    										when 'ATACADO' then PRECOATACADO
    										when 'CLIENTE' then PRECOVENDA
    										when 'DISTRIBUIDOR' then PRECODISTRIBUIDOR
    										else null end as preco 
    								from produtos
    								where CODPROD = @CODPROD
    								)
    	when tabela is not null then (	select	case cliente.TIPO
    											when 'ATACADO' then PRECOATACADO
    											when 'CLIENTE' then PRECOVENDA
    											when 'DISTRIBUIDOR' then PRECODISTRIBUIDOR
    											else null end as preco 
    									from TABELAPRODUTO 
    									WHERE CODPROD = @CODPROD 
    									 AND TABELAPRODUTO.TABELA = CLIENTE.TABELA)
    FROM CLIENTES 
    WHERE CODCLI = @CODCLI

    Carlos Eduardo Pieren - MCP
    • Sugerido como Resposta Carlos Eduardo Pieren terça-feira, 22 de setembro de 2009 18:24
    • Marcado como Resposta JrCesar quarta-feira, 23 de setembro de 2009 16:05
    terça-feira, 22 de setembro de 2009 18:24