Add or subtract value according to the "release type" (MSSQL)

Asked

Viewed 75 times

3

I have the following query:

SELECT
MOVTIPOPRODUTO.ID_ENTIDADE, 
ENTIDADE.NOMECLIENTE, 
PRODUTO.NOMEPRODUTO, 
TIPOPRODUTO.DESCRICAO,
MOVTIPOPRODUTO.ID_PRODUTO, 
MOVTIPOPRODUTO.ID_TIPOPRODUTO, 
MOVTIPOPRODUTO.ID_SAFRA,  
MOVTIPOPRODUTO.ID_LOCALESTOQUE, 
MOVTIPOPRODUTO.TIPOLCTO, 
SUM(QTDEKG) AS SALDO_KG
FROM MOVTIPOPRODUTO 
INNER JOIN PRODUTO ON PRODUTO.ID_PRODUTO = MOVTIPOPRODUTO.ID_PRODUTO 
INNER JOIN TIPOPRODUTO ON TIPOPRODUTO.ID_TIPOPRODUTO = MOVTIPOPRODUTO.ID_TIPOPRODUTO 
LEFT JOIN ENTIDADE ON ENTIDADE.ID_CLIENTE = MOVTIPOPRODUTO.ID_ENTIDADE 
LEFT JOIN PESAGEM ON PESAGEM.REFERENCIA = MOVTIPOPRODUTO.REFERENCIA 
WHERE (MOVTIPOPRODUTO.ID_ENTIDADE > 0) 
AND ISNULL(MOVTIPOPRODUTO.ID_ENTIDADE, 0) = 88
AND MOVTIPOPRODUTO.CANCELADO = 0 
GROUP BY 
MOVTIPOPRODUTO.ID_PRODUTO, 
MOVTIPOPRODUTO.ID_TIPOPRODUTO, 
MOVTIPOPRODUTO.ID_SAFRA, 
MOVTIPOPRODUTO.ID_ENTIDADE, 
MOVTIPOPRODUTO.ID_LOCALESTOQUE, 
PRODUTO.NOMEPRODUTO, 
TIPOPRODUTO.DESCRICAO, 
ENTIDADE.NOMECLIENTE, 
MOVTIPOPRODUTO.TIPOLCTO
ORDER BY PRODUTO.NOMEPRODUTO

And I need that depending on the TIPOLCTO the value (SUM(QTDEKG) AS SALDO_KG) be subtracted instead of summed. Ex:

  • If TIPOLCTO = 1, he must add
  • If TIPOLCTO = 2, he must subtract
  • If TIPOLCTO = 3, it must subtract (also)
  • If TIPOLCTO = 0, he must ignore the value

I’ve tried everything, but I can’t understand how he’s gonna do it

Today is returning me the following result:

ID  NOME            PROD.   TIPO PROD.      ID1 ID2 ID3 ID4 TIPOLCTO    SALDO_KG
88  NOME DO CLIENTE SOJA    SOJA INTACTA    1   3   3   1   4           1243997,496
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 1    3   4   1   1   4           800265,21
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 1    3   4   2   1   4           780134,434
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 2    3   5   1   1   4           438133,43
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 2    3   5   2   1   4           71170,524
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 3    3   6   1   1   2           570,00
88  NOME DO CLIENTE TRIGO   TRIGO TIPO 3    3   6   1   1   4           65413,94

Today I’m listing this table in a PHP table, thanks in advance!

  • and when it is 4 (as in most lines)?

  • It will subtract as well, because the launch type in the case means whether the value gave input, output, internal or external transfer which would also be subtraction in the case! Thank you

2 answers

3


Use case to do as you wish!

With it you can condition the value field with the feature you want (negative, positive, zeroed...) and then add up everything.

Conditions for the field MOVTIPOPRODUTO.TIPOLCTO:

 case
    when MOVTIPOPRODUTO.TIPOLCTO = 1 then
     QTDEKG
    when MOVTIPOPRODUTO.TIPOLCTO in (2, 3) then
     QTDEKG * -1
    when MOVTIPOPRODUTO.TIPOLCTO = 0 then
     0
    --pode ainda acrescentar else para outros valores

 end SALDO_KG

SQL Completa:

select ID_ENTIDADE,
       NOMECLIENTE,
       NOMEPRODUTO,
       DESCRICAO,
       ID_PRODUTO,
       ID_TIPOPRODUTO,
       ID_SAFRA,
       ID_LOCALESTOQUE,
       TIPOLCTO,
       sum(SALDO_KG) as SALDO_KG
  from (select MOVTIPOPRODUTO.ID_ENTIDADE,
               ENTIDADE.NOMECLIENTE,
               PRODUTO.NOMEPRODUTO,
               TIPOPRODUTO.DESCRICAO,
               MOVTIPOPRODUTO.ID_PRODUTO,
               MOVTIPOPRODUTO.ID_TIPOPRODUTO,
               MOVTIPOPRODUTO.ID_SAFRA,
               MOVTIPOPRODUTO.ID_LOCALESTOQUE,
               MOVTIPOPRODUTO.TIPOLCTO,
               --sum(QTDEKG) as SALDO_KG
               case
                  when MOVTIPOPRODUTO.TIPOLCTO = 1 then
                   QTDEKG
                  when MOVTIPOPRODUTO.TIPOLCTO in (2, 3) then
                   QTDEKG * -1
                  when MOVTIPOPRODUTO.TIPOLCTO = 0 then
                   0
               end SALDO_KG
          from MOVTIPOPRODUTO
         inner join PRODUTO on PRODUTO.ID_PRODUTO = MOVTIPOPRODUTO.ID_PRODUTO
         inner join TIPOPRODUTO on TIPOPRODUTO.ID_TIPOPRODUTO = MOVTIPOPRODUTO.ID_TIPOPRODUTO
          left join ENTIDADE on ENTIDADE.ID_CLIENTE = MOVTIPOPRODUTO.ID_ENTIDADE
          left join PESAGEM on PESAGEM.REFERENCIA = MOVTIPOPRODUTO.REFERENCIA
         where (MOVTIPOPRODUTO.ID_ENTIDADE > 0)
           and ISNULL(MOVTIPOPRODUTO.ID_ENTIDADE, 0) = 88
           and MOVTIPOPRODUTO.CANCELADO = 0)
 group by ID_ENTIDADE,
          NOMECLIENTE,
          NOMEPRODUTO,
          DESCRICAO,
          ID_PRODUTO,
          ID_TIPOPRODUTO,
          ID_SAFRA,
          ID_LOCALESTOQUE,
          TIPOLCTO
 order by NOMEPRODUTO

Simplifying (without Subquery), within itself SUM():

select MOVTIPOPRODUTO.ID_ENTIDADE,
       ENTIDADE.NOMECLIENTE,
       PRODUTO.NOMEPRODUTO,
       TIPOPRODUTO.DESCRICAO,
       MOVTIPOPRODUTO.ID_PRODUTO,
       MOVTIPOPRODUTO.ID_TIPOPRODUTO,
       MOVTIPOPRODUTO.ID_SAFRA,
       MOVTIPOPRODUTO.ID_LOCALESTOQUE,
       MOVTIPOPRODUTO.TIPOLCTO,
       --SUM(QTDEKG) AS SALDO_KG
       sum(case
              when MOVTIPOPRODUTO.TIPOLCTO = 1 then
               QTDEKG
              when MOVTIPOPRODUTO.TIPOLCTO in (2, 3) then
               QTDEKG * -1
              when MOVTIPOPRODUTO.TIPOLCTO = 0 then
               0
           end) SALDO_KG
  from MOVTIPOPRODUTO
 inner join PRODUTO on PRODUTO.ID_PRODUTO = MOVTIPOPRODUTO.ID_PRODUTO
 inner join TIPOPRODUTO on TIPOPRODUTO.ID_TIPOPRODUTO = MOVTIPOPRODUTO.ID_TIPOPRODUTO
  left join ENTIDADE on ENTIDADE.ID_CLIENTE = MOVTIPOPRODUTO.ID_ENTIDADE
  left join PESAGEM on PESAGEM.REFERENCIA = MOVTIPOPRODUTO.REFERENCIA
 where (MOVTIPOPRODUTO.ID_ENTIDADE > 0)
   and ISNULL(MOVTIPOPRODUTO.ID_ENTIDADE, 0) = 88
   and MOVTIPOPRODUTO.CANCELADO = 0
 group by MOVTIPOPRODUTO.ID_PRODUTO,
          MOVTIPOPRODUTO.ID_TIPOPRODUTO,
          MOVTIPOPRODUTO.ID_SAFRA,
          MOVTIPOPRODUTO.ID_ENTIDADE,
          MOVTIPOPRODUTO.ID_LOCALESTOQUE,
          PRODUTO.NOMEPRODUTO,
          TIPOPRODUTO.DESCRICAO,
          ENTIDADE.NOMECLIENTE,
          MOVTIPOPRODUTO.TIPOLCTO
 order by PRODUTO.NOMEPRODUTO
  • 1

    I just don’t understand why sub-select.

  • It is not necessary! But for understanding is better... It can be changed quietly within the SUM()

  • 1

    Thanks a lot Melissa, it worked perfectly without Subquery! I was since Friday hitting me on this! Big hug! :)

2

SELECT
MOVTIPOPRODUTO.ID_ENTIDADE, 
ENTIDADE.NOMECLIENTE, 
PRODUTO.NOMEPRODUTO, 
TIPOPRODUTO.DESCRICAO,
MOVTIPOPRODUTO.ID_PRODUTO, 
MOVTIPOPRODUTO.ID_TIPOPRODUTO, 
MOVTIPOPRODUTO.ID_SAFRA,  
MOVTIPOPRODUTO.ID_LOCALESTOQUE, 
MOVTIPOPRODUTO.TIPOLCTO, 
CASE 
WHEN TIPOLCTO = 2
THEN 
   SUM(QTDEKG * -1)
ELSE 
  SUM(QTDEKG)
END 
AS SALDO_KG
FROM MOVTIPOPRODUTO 
INNER JOIN PRODUTO ON PRODUTO.ID_PRODUTO = MOVTIPOPRODUTO.ID_PRODUTO 
INNER JOIN TIPOPRODUTO ON TIPOPRODUTO.ID_TIPOPRODUTO = MOVTIPOPRODUTO.ID_TIPOPRODUTO 
LEFT JOIN ENTIDADE ON ENTIDADE.ID_CLIENTE = MOVTIPOPRODUTO.ID_ENTIDADE 
LEFT JOIN PESAGEM ON PESAGEM.REFERENCIA = MOVTIPOPRODUTO.REFERENCIA 
WHERE (MOVTIPOPRODUTO.ID_ENTIDADE > 0) 
AND ISNULL(MOVTIPOPRODUTO.ID_ENTIDADE, 0) = 88
AND MOVTIPOPRODUTO.CANCELADO = 0 
GROUP BY 
MOVTIPOPRODUTO.ID_PRODUTO, 
MOVTIPOPRODUTO.ID_TIPOPRODUTO, 
MOVTIPOPRODUTO.ID_SAFRA, 
MOVTIPOPRODUTO.ID_ENTIDADE, 
MOVTIPOPRODUTO.ID_LOCALESTOQUE, 
PRODUTO.NOMEPRODUTO, 
TIPOPRODUTO.DESCRICAO, 
ENTIDADE.NOMECLIENTE, 
MOVTIPOPRODUTO.TIPOLCTO
ORDER BY PRODUTO.NOMEPRODUTO

Browser other questions tagged

You are not signed in. Login or sign up in order to post.