none
Recursão com duas Tabelas RRS feed

  • Pergunta

  • Olá Pessoal Bom dia, 

    Estou com um problema um tanto complicado. Tenho uma sql que calcula o custo de um Produto que tem Matéria Prima. O cálculo é feito da seguinte forma:

    1º Inicio com um Ponto de Partida (Produto que desejo saber o Custo)

    2º Verico se esse produto tem Matéria Prima

    3º Se o Item 2 for verdadeiro, então continuo verificando se o produto tem Matéria Prima até chegar em um que não tem

    4º Depois eu Multiplico as quantidade das Matérias prima que a sql encontrou e multiplico pelo custo do produto que não tem materia prima (Item 3)

    5º e por ultimo eu somo todos os custo para me retornar o total

    No Meu Banco tem a tabela Produtos e a Tabela Filha Matéria Prima, com a sql que fiz ela está limite em apenas 5 Matéria da Matéria Prima

    Elas estao Definidas da Seguinte Forma:

    -- Produtos

    Seqüência do Produto, Descrição, Valor de Custo

    -- Matéria Prima

    Seqüência do Produto, Seqüência da Matéria Prima, Quantidade

    Gostaria de saber se existe uma forma de deixá-la mais reflexivel tipo uma Recursividade.

    A SQL que fiz Limitada está a baixo:

    SELECT SUM(Total) + SUM(Total) * 0.15 AS Total FROM (
       SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
       SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
       SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
       SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
       SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], SUM([Qtde 5] * [Custo 5]) AS Total FROM (
       SELECT
        P2.[Código Produto] AS [Produto 1],
        MP1.[Qtde de Matéria Prima] AS [Qtde 1],
        CASE WHEN P2.[Valor Custo] IS Null Then P1.[Valor Custo] ELSE P2.[Valor Custo] END AS [Custo 1],
        P3.[Código Produto] AS [Produto 2],
        CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 2],
        CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END Else P3.[Valor Custo] END AS [Custo 2],
        P4.[Código Produto] AS [Produto 3],
        CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 3],
        CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END Else P3.[Valor Custo] END Else P4.[Valor Custo] END AS [Custo 3],
        P5.[Código Produto] AS [Produto 4],
        CASE WHEN MP4.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 4],
        CASE WHEN P5.[Valor Custo] IS Null Then CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END ELSE P3.[Valor Custo] END ELSE P4.[Valor Custo] END ELSE P5.[Valor Custo] END AS [Custo 4],
        P6.[Código Produto] AS [Produto 5],
        CASE WHEN MP5.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP4.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP5.[Qtde de Matéria Prima] * MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 5],
        CASE WHEN P6.[Valor Custo] IS Null Then CASE WHEN P5.[Valor Custo] IS Null Then CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 ELSE P2.[Valor Custo] END ELSE P3.[Valor Custo] END ELSE P4.[Valor Custo] END ELSE P5.[Valor Custo] END ELSE P6.[Valor Custo] END AS [Custo 5]   
       FROM
        Produtos P1 INNER JOIN
        [Matéria Prima do Produto] MP1 ON P1.[Código Produto] = MP1.[Código do Produto] LEFT JOIN
        Produtos P2 ON MP1.[Código da Matéria Prima] = P2.[Código Produto] LEFT JOIN
        [Matéria Prima do Produto] MP2 ON P2.[Código Produto] = MP2.[Código do Produto] LEFT JOIN
        Produtos P3 ON MP2.[Código da Matéria Prima] = P3.[Código Produto] LEFT JOIN
        [Matéria Prima do Produto] MP3 ON P3.[Código Produto] = MP3.[Código do Produto] LEFT JOIN
        Produtos P4 ON MP3.[Código da Matéria Prima] = P4.[Código Produto] LEFT JOIN
        [Matéria Prima do Produto] MP4 ON P4.[Código Produto] = MP4.[Código do Produto] LEFT JOIN
        Produtos P5 ON MP4.[Código da Matéria Prima] = P5.[Código Produto] LEFT JOIN
        [Matéria Prima do Produto] MP5 ON P5.[Código Produto] = MP5.[Código do Produto] LEFT JOIN
        Produtos P6 ON MP5.[Código da Matéria Prima] = P6.[Código Produto]
       WHERE P1.[Código Produto] = 1) T1
       GROUP BY [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5]) T2) T3) T4) T5) T6


    Armando Correa H Neto

    quinta-feira, 1 de março de 2012 12:04

Todas as Respostas

  • Essa query tá bem bacana.

    Ela funciona?

    De repente o melhor caminho não é a recursão e sim um meio termo entre performance e facilidade de dar manutenção.

    quarta-feira, 21 de novembro de 2012 18:02
  • funciona sim mas como te falei ela só aceita 5 matéria da matéria prima

    Armando Correa H Neto

    quarta-feira, 21 de novembro de 2012 18:07
  • Armando,

    Me desculpa, mas não entendi a tua lógica para encontrar o custo de um produto...

    Será que você teria como montar um exemplo para tentarmos entender melhor o resultado que você espera obter?

    Certamente existe uma forma melhor para o que você quer, basta entendermos a tua necessidade.

    []'s

    quinta-feira, 22 de novembro de 2012 10:40