Dúvida - Trazer dado de uma tabela referenciando outro dado da mesma tabela

25/07/2020

0

Boa noite,

Estou montando um Script para analisar custo de produto, o que precisaria trazer em uma nova coluna seria a grade padrão, pois temos uma variação de consumo pra mais e pra menos dependendo do tamanho da grade.

Abaixo segue o exemplo do SQL trazendo os dados de grade:

SELECT
MG.MODELO,
MG.NUMERO,
MG.LIBERADO,
MG.TAM_CORRUG,
MG.PERCENTUAL_PRECO,
MPCN.PROP_CONSUMO,
MPCN.PROPORCAO
FROM
PCP_MODELOS_GRADE MG,
PCP_MODELOS_PROP_CONSUMO MPC,
PCP_MODELOS_PROPORCAO MPCN
WHERE
1 = 1
AND MG.MODELO = MPC.MODELO
AND MG.MODELO = MPCN.MODELO
AND MG.NUMERO = MPCN.NUMERO
AND MPC.PROP_CONSUMO = MPCN.PROP_CONSUMO
AND MG.MODELO = ''MAINLINE''

Resultado:

MODELO | NUMERO | LIB | TAM | PERC_PR | PROP_CONSUMO |PROPORCAO
-----------------|-----------------|-------|--------------|------------------|------------------------------|---------------------
MAINLINE | 33/34 | N | UNI | 100,00 | 1 | 57,29
MAINLINE | 35/36 | N | UNI | 100,00 | 1 | 60,95
MAINLINE | 37/38 | N | UNI | 100,00 | 1 | 64,84
MAINLINE | 39/40 | N | UNI | 100,00 | 1 | 68,98
MAINLINE | 41/42 | N | UNI | 100,00 | 1 | 73,39
MAINLINE | 43/44 | N | UNI | 100,00 | 1 | 78,07
MAINLINE | 35 6 | S | UNI | 100,00 | 1 | 88,36
MAINLINE | 33 4 | S | UNI | 100,00 | 1 | 83,05
MAINLINE | 37 8 | S | UNI | 100,00 | 1 | 94,00
MAINLINE | 39 0 | S | UNI | 100,00 | 1 | 100,00
MAINLINE | 41 2 | S | UNI | 100,00 | 1 | 106,00
MAINLINE | 43 4 | S | UNI | 100,00 | 1 | 112,36

Abaixo segue um SQL trazendo vários dados, usei o WITH pra criar tabelas temporárias desses dados:

WITH
MODELOS AS
(
SELECT
M.LINHA,
M.MODELO,
M.NOME,
M.NOME_FAT,
M.NOME_PED,
M.GRUPO_MODELO,
M.UNIDADE_MEDIDA,
M.MODELISTA,
M.NBM,
M.DISPONIVEL_REP,
M.DESATIVADO,
M.PESO_BRUTO,
M.PESO_LIQUIDO,
M.SEGMENTO,
M.COLECAO,
M.SUBCOLECAO AS SUBCOLECAO_PCP_1_9_1,
M.ADOTADO
FROM
PCP_MODELOS M
--WHERE
--M.MODELO = ''ZARRIAH''
),
NUMERO_CORRUGADAS AS
(
SELECT
MG.MODELO,
MG.NUMERO,
MG.LIBERADO,
MG.TAM_CORRUG,
MG.PERCENTUAL_PRECO,
MPCN.PROP_CONSUMO,
MPCN.PROPORCAO
FROM
PCP_MODELOS_GRADE MG,
PCP_MODELOS_PROP_CONSUMO MPC,
PCP_MODELOS_PROPORCAO MPCN
WHERE
1 = 1
AND MG.MODELO = MPC.MODELO
AND MG.MODELO = MPCN.MODELO
AND MG.NUMERO = MPCN.NUMERO
AND MPC.PROP_CONSUMO = MPCN.PROP_CONSUMO
--AND MG.MODELO = ''ZARRIAH''
),
COMBINACOES AS
(
SELECT
C.MODELO,
C.COMB_MATERIAL,
C.CORES,
C.SEQUENCIA,
C.NOMECOMBINACAO,
C.SUBCOLECAO,
C.DISPONIVEL_PROGRAMACAO,
C.DESATIVADO,
C.DATA_MODIFICACAO,
C.ID_PRODUTO
FROM
PCP_COMB_MATERIAIS_SEQ C
--WHERE
--C.MODELO = ''ZARRIAH''
),
FICHA_TECNICA AS
(
SELECT
FT.SETOR,
FT.MODELO,
FT.FT_MODELO,
FT.MATERIAL_PCP,
FT.NOME AS NOME_MAT_PCP,
FTCOR.COR,
CR.NOME AS NOME_COR,
FT.CABEDAL,
FT.COURO,
FT.PECA,
FT.COMPONENTE,
COMP.NOME AS NOME_COMPONENTE,
FT.TP_CONSUMO,
FTCON.FINALIDADE,
FTCON.CONSUMO,
FT.GRADE_LEV_MATERIAIS,
FT.PROP_CONSUMO,
FT.OBSERVACAO,
FT.USUARIO,
FT.DESATIVADO
FROM
PCP_FT_MODELOS FT,
PCP_FT_MODELOS_CONSUMOS FTCON,
PCP_COMPONENTES COMP,
PCP_FT_MODELOS_CORES_COMB FTCOR,
PCP_CORES CR
WHERE
1 = 1
AND FT.FT_MODELO = FTCON.FT_MODELO
AND FT.MODELO = FTCON.MODELO_LOG
AND FT.COMPONENTE = COMP.COMPONENTE
AND FT.FT_MODELO = FTCOR.FT_MODELO(+)
AND FT.MODELO = FTCOR.MODELO_LOG(+)
AND FTCOR.COR = CR.COR(+)
AND FTCON.FINALIDADE = ''1''
--AND FT.MODELO = ''585040''
--AND FT.FT_MODELO = ''169422''
ORDER BY
FT.SETOR ASC,
FT.MODELO ASC,
FT.FT_MODELO ASC
),
GRUPO_MODELO AS
(
SELECT
GM.CODIGO,
GM.NOME,
GM.SIGLA
FROM
TAB000037 GM
),
COLECAO AS
(
SELECT
CO.CODIGO,
CO.NOME
FROM
PED010023 CO
),
SUBCOLECAO AS
(
SELECT
SC.CODIGO,
SC.NOME
FROM
PED01002302 SC
),
SETORES AS
(
SELECT
ST.SETOR,
ST.NOME AS NOME_SETOR,
ST.INF_FABRICA_BXA_TALAO,
ST.CONCATENAR_SETOR_TALAO
FROM
PCP_SETORES ST
)
SELECT
MO.LINHA,
MO.MODELO,
MO.NOME AS NOME_MODELO,
COMB.COMB_MATERIAL,
COMB.CORES,
COMB.SEQUENCIA,
COMB.NOMECOMBINACAO,
MO.GRUPO_MODELO,
GM.NOME AS GRUPO_MOD_NOME,
MO.NBM,
MO.COLECAO,
CO.NOME AS NOME_COLECAO,
COMB.SUBCOLECAO,
SC.NOME AS NOME_SUBCOLECAO,
MO.PESO_BRUTO,
MO.PESO_LIQUIDO,
FT.SETOR,
ST.NOME_SETOR,
FT.FT_MODELO,
FT.MATERIAL_PCP,
FT.NOME_MAT_PCP,
FT.OBSERVACAO,
FT.COR AS COR_FT,
FT.NOME_COR AS NOME_COR_FT,
FT.PECA,
FT.COMPONENTE,
FT.NOME_COMPONENTE,
FT.CONSUMO,
FT.DESATIVADO AS DESATIVADO_FT,
MO.DESATIVADO AS DESATIVADO_MOD,
COMB.DESATIVADO AS DESATIVADO_COMB
FROM
MODELOS MO,
COMBINACOES COMB,
GRUPO_MODELO GM,
COLECAO CO,
SUBCOLECAO SC,
FICHA_TECNICA FT,
SETORES ST
WHERE
1 = 1
AND MO.MODELO = COMB.MODELO
AND MO.MODELO = FT.MODELO
AND FT.SETOR = ST.SETOR
AND MO.COLECAO = CO.CODIGO(+)
AND MO.GRUPO_MODELO = GM.CODIGO(+)
AND COMB.SUBCOLECAO = SC.CODIGO(+)
AND MO.MODELO = ''MAINLINE''
ORDER BY
MO.LINHA ASC,
MO.MODELO ASC,
COMB.SEQUENCIA ASC,
FT.SETOR ASC

O que eu preciso é trazer mais uma coluna e está tem que trazer o número da grade e a proporção, neste exemplo, teria que ser: a grade = 39 0 e proporção 100,00, só não sei de que maneira poderia trazer isso, lembrando que temos inúmeros tipos de grade para diferentes produtos, exemplo, Mercado interno a grade padrão é o 35, Mercado externo varia em várias grades, o que poderia usar de exemplo pra trazer sempre a grade padrão, seria a proporção = 100,00, assim não iria trazer dados desnecessários, no caso das outras grades.

Uso o PLSQL Developer versão 13.

Tks.
Felipe Esparrenberger

Felipe Esparrenberger

Responder

Posts

27/07/2020

Emerson Nascimento

WHERE 1 = 1 
?!?!?!

o que poderia usar de exemplo pra trazer sempre a grade padrão, seria a proporção = 100,00
e de onde é obtida a proporção? é de um campo? de um cálculo?
Responder

27/07/2020

Felipe Esparrenberger

WHERE 1 = 1 
?!?!?!

Não entendi, algum problema em usar: 1 = 1??

o que poderia usar de exemplo pra trazer sempre a grade padrão, seria a proporção = 100,00
e de onde é obtida a proporção? é de um campo? de um cálculo?


É de um campo, chamado Proporção, eu fiz uma tabela mais acima, mas ela ficou desconfigurada quando colei, mas seria o campo: Proporção e no caso seria o registro com o valor: 100,00 este significa que usa 100% do consumo de material, então este é pra ser a grade padrão.
Responder

29/07/2020

Emerson Nascimento

não é só filtrar ?
obs.: alterei o relacionamento porque acho mais fáci entender com o join explícito. acho mais 'legível' se deixar o where somente para os filtros.
SELECT
	MG.MODELO,
	MG.NUMERO,
	MG.LIBERADO,
	MG.TAM_CORRUG,
	MG.PERCENTUAL_PRECO,
	MPCN.PROP_CONSUMO,
	MPCN.PROPORCAO
FROM
	PCP_MODELOS_GRADE MG
INNER JOIN
	PCP_MODELOS_PROP_CONSUMO MPC ON MPC.MODELO = MG.MODELO
INNER JOIN
	PCP_MODELOS_PROPORCAO MPCN ON MPCN.MODELO = MG.MODELO
	AND MPCN.NUMERO = MG.NUMERO
	AND MPCN.PROP_CONSUMO = MPC.PROP_CONSUMO
	AND MPCN.PROPORCAO = 100
WHERE
	1 = 1 --  ?????
	AND MG.MODELO = 'MAINLINE'




Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar