Add or subtract value, depending on the type of posting (MSSQL)

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

It is necessary that depending on the TIPOLCTO the (SUM(QTDEKG) AS SALDO_KG) value is subtracted instead of added. Ex:

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

I have tried everything, but I can not understand how it will do it

Today I'm returning 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

I'm currently listing this table in a PHP table, thank you in advance!

    
asked by anonymous 23.07.2018 / 14:27

2 answers

3

Use case to do what you want!

With it you can condition the value field with the characteristic you want (negative, positive, zeroed ...) and then add 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

Complete SQL:

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 the SUM() itself:

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
    
23.07.2018 / 14:35
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
    
23.07.2018 / 14:37