Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

krvel

Multiplus Selects ou Joins na mesma tabela

Recommended Posts

Olá a todos... gostaria de saber se alguém pode me ajudar com o seguinte problema.
Tenho uma Tabela de Preços, de um software já pronto que um cliente utiliza, e dentro dessa tabela, existe o cadastro dos códigos de produtos, o código da tabela, e o preço desse produto. No caso o cliente utiliza 08 tabelas (não sei pra que tudo isso).

Ordem_Prod_Serv Ordem_Tabela_Preco Preco

50 4 0

50 6 6,75

50 7 405

50 8 1188,1

50 9 256,5

50 10 631,1684

50 11 0

50 12 0

51 4 0

51 6 5,1

51 7 306

51 8 897,7

51 9 193,8

51 10 476,8828

51 11 0

51 12 0

52 4 0

52 6 2,58

52 7 154,8

52 8 454,1

52 9 98,04

52 10 241,2466

52 11 0

52 12 0

 

 

Como podem ver pela tabela acima, um exemplo de parte dos 30.000 itens cadastrados. Seria mais fácil se todos os produtos estivessem cadastrados em todas as tabelas, mesmo que com o preço zerado. Por exemplo na tabela 4 ele tem o preço de 8,00 e nas demais tabelas fosse 0,00... Que bastaria fazer um select com um where e dizer qual a tabela, e viriam os mesmos dados na mesma ordem.

Porém não sei como foi a idéia de ser criada essa tabela, que se eu fizer um select com where pela tabela, tem tabela que me traz 30 mil itens, tem tabela que me traz 18 mil.. cada uma me traz uma quantidade diferente.
O que eu gostaria de saber é se alguém pode me ajudar com algum tipo de select, onde ele percorra a tabela, e selecione todos os codigos 1, e preencha um campo chamado tab1 com o preço, e se ouver preço nas outras tabelas, os outros campos sejam preenchidos também, e se não tiver, fique com o valor 0. Para que dessa forma, se eu tiver 20 produtos... eu vou ter 20 linhas na tabela, e cada linha vai ter digamos 08 campos de tabelas e cada uma com os preços... como um exemplo abaixo:

 

 

Codigo Tab4_Preco Tab5_Preco Tab6_Preco Tab7_Preco Tab8_Preco

50 120 0 0 154,8 0

51 0 256,5 0 0 0

52 405 0 0 480 454,1

53 0 306 0 0 360

 


Não sei se fui claro... mas qualquer dúvida posso tentar esclarecer melhor...

Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi seu problema mas vejo 3 soluções diferentes

 

a) unificar as tabelas (parece ser inviável)

 

b) usar uma view

 

algo como

 

create or replace view v_tabela_precos as

select 't1' tabela, cod_produto from tabela1

unon all

select 't2' tabela, cod_produto from tabela2

unon all

...

select 't8' tabela, cod_produto from tabela8

 

os acesso passam a ser feitos pela view v_tabela_precos

 

c) user functions que tratem as diversas tabelas

 

por exemplo

create function retorna_preco as

... calcula o preço conforme as diversas regras

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi seu problema mas vejo 3 soluções diferentes

 

a) unificar as tabelas (parece ser inviável)

 

B) usar uma view

 

algo como

 

create or replace view v_tabela_precos as

select 't1' tabela, cod_produto from tabela1

unon all

select 't2' tabela, cod_produto from tabela2

unon all

...

select 't8' tabela, cod_produto from tabela8

 

os acesso passam a ser feitos pela view v_tabela_precos

 

c) user functions que tratem as diversas tabelas

 

por exemplo

create function retorna_preco as

... calcula o preço conforme as diversas regras

end;

 

 

Olá Motta... obrigado pelo pronto retorno...

Então... Na verdade é uma tabela só...

Nessa tabela, existe um campo de ID sequencial, um campo com o codigo do produto, codigo da tabela (vinculado a uma outra tabela que possui o id e o nome, entre outras informacoes), e o preço...

 

Então por exemplo... quando eu cadastro o produto 386... e defino um valor de 100,00 na tabela 4, e 300 na tabela 5 e 280,00 na tabela 6 (por exemplo), ele cria 2 registros... como no exemplo:

 

ID COD_Produto Ordem_Tabela Preco

17001 386 4 100

17002 386 5 300

17003 386 6 280

17004 387 1 50

17005 387 4 70

 

Veja pelo exemplo, que temos 2 codigos cadastrados o 386 e o 387... o 386 ele tem preco na tabela 4,5,6... e o 387 tem preco na tabela 1 e 4.... O que eu precisaria era que saisse algo desse tipo abaixo:

 

ID COD_Produto Tabela1 Tabela4 Tabela5 Tabela6

001 386 0 100 300 280

002 387 50 70 0 0

 

 

Acho que assim ficou mais fácil de entender... O que eu quero é que ele traga uma tabela com todos os produtos que eu tenho cadastrado na tabela de preço... então se eu tiver 10 produtos... ele vai trazer 10 linhas... e cada linha ele vai me mostrar o preço na tabela que tiver o preco e nas tabelas que não tem nada cadastrado, ele colocaria 0...

Seria um tipo de união ou join.... mas da mesma tabela... Fazer selects com 2 ou mais tabelas até não acho muito dificil, (pois não é toda hora que preciso migrar bancos).... mas nesse caso estou meio perdido, pois não tenho idéia de como faria pra pegar os dados de 1 tabela... e criar outra tabela como a do exemplo acima...

 

 

Se tiver um modelo de como fazer para esse exemplo, eu consigo adaptar depois para gerar as 8 tabelas de preço...

 

Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Humm... não... como disse.. eu mexo pouco com sql... não trabalho como desenvolvedor, e sim com suporte... Mas vira e mexe quebro meus galhos com banco de dados, C# ou algo do tipo...

Vou tentar dar uma olhada nos links que mandou para ver se consigo entender ou se resolve o meu problema...

Por enquanto obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Olá Motta, obrigado pelos links... Então... tentei fazer algo aqui.. e acho que deu quase certo... tá faltando só um toquinho e fica do jeito que quero...

 

 

6822169b78964ecca1fb592b1019e949.jpg

 

 

Repare que por exemplo o código 1, aparece em 4 linhas... mas na verdade, eu queria que aparecesse em apenas 1 linha só... no caso a linha 01... e nela ficasse os valores dessa forma:

 

1 0,00 2,43 0,00 427,70 0,00 277,5998 0,00 0,00

 

e assim por diante... o codigo 2 em uma linha, o 3 em uma linha.... consecutivamente...

Da uma olhadinha no print que postei... acima da tabela tem o codigo que eu estou utilizando.. O que eu poderia fazer para agrupar tudo em uma linha só.... no caso do codigo 1... uma no codigo 2... e assim por diante.. ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara... tentei, tentei... e consegui... novamente... obrigado pelo link... ajudou a dar uma luz no fim do tunel...

 

Ficou do jeito que eu queria...

 

cbdd810a495d41e782b3378c5d89dc93.jpg

 

 

Modifiquei algumas coisas no codigo... e deu o resultado esperado... segue como ficou o código:

 

 

use [s9_Real];
go
SELECT Ordem_Prod_Serv
,ISNULL([4], 0) as Tab4
,ISNULL([6], 0) as Tab6
,ISNULL([7], 0) as Tab7
,ISNULL([8], 0) as Tab8
,ISNULL([9], 0) as Tab9
,ISNULL([10], 0) as Tab10
,ISNULL([11], 0) as Tab11
,ISNULL([12], 0) as Tab12
FROM ( Select Ordem_Prod_Serv, Ordem_Tabela_Preco, Preco
from dbo.Prod_Serv_Precos group by Ordem_Prod_Serv, Ordem_Tabela_Preco, Preco) p
PIVOT (
SUM(p.preco)
FOR p.Ordem_Tabela_Preco IN ([4],[6],[7],[8],[9], [10], [11], [12]) ) T
ORDER BY Ordem_Prod_Serv;
Agora consigo fazer o que preciso... Valeu....

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por FabianoSouza
      Tenho a tabela VAGAS e a tab INSCRITOS.
       
      Preciso fazer um SELECT para retornar as Vagas e a quantidade de candidatos inscritos para cada VAGA.
       
      Fazendo isso retorna duplicidade de Vagas... :-(
       
      select V.empresa, COunt(CIV.cdVaga) AS insc from dbo.vagas AS V LEFT JOIN dbo.inscVaga AS CIV ON V.codigo = CIV.cdVaga GROUP BY V.codigo, V.empresa Como monto essa consulta??
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.