Jump to content
Fórum Script Brasil
  • 0

(Resolvido) SOMAR VALORES DE DOIS CASES


Vinicius Schuh

Question

Bom dia Amigos! Espero que todos tenham uma boa semana...

Tenho a seguinte query:

SELECT     
dbo.Funcionários.NomeDoFuncionário, 
Month(dbo.Orçamento.DataDoOrçamento) As Mes, 
NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento) 
        When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO' 
        When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO' 
        When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO' 
        End,
dbo.Orçamento.CódigoDoFuncionário,
ABERTO = Case When NO_Venda Is Null Then Count(Orçamento.CódigoDoFuncionário)When NO_VENDA IS NULL THEN '0' End,
FECHADO = Case When NO_Venda Is Not Null Then Count(Orçamento.CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End,
GETDATE() As DT_Imp

FROM         
dbo.Orçamento 

INNER JOIN 
dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário

GROUP BY 
Month(dbo.Orçamento.DataDoOrçamento), 
dbo.Funcionários.NomeDoFuncionário, 
dbo.Orçamento.CódigoDoFuncionário,
NO_Venda

ORDER BY 
dbo.Funcionários.NomeDoFuncionário,
Mes

Que ira me retornar, o número de Orçamentos ABERTOS e FECHADOS nos determinados meses. Preciso realizar o cálculo de quanto ira representar (Aberto e Fechado) em % (Percentual). Sei que para realizar tal cálculo, preciso pegar o total de ABERTOS ou FECHADOS multiplicar por 100 e dividir pelo total de Orçamentos(Soma Aberto e Fechado).

A pergunta é, como poderia fazer para realizar a soma dos dois CASES que me trazem o total de orçamentos em ABERTO e FECHADO para ter o TOTAL GERAL?

Desde já agradeço.

Edited by Vinicius Schuh
Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

Boa tarde Vinicius,

Apenas o case não vai funcionar mesmo. Se quisesse desta forma, teria q utilizar o bloco inteiro do select. Aí o sql ia ficar monstro... rs.

(SELECT Case When NO_Venda Is Null Then Count(Orçamento.CódigoDoFuncionário) from .....) +
(SELECT Case When NO_Venda Is Not Null Then Count(Orçamento.CódigoDoFuncionário) from .....)

Pode fazer um "select into". Assim você já faria o select e criaria a tabela temporária para manipulação.

Link to comment
Share on other sites

  • 0

Bom dia Vinicius,

Teria sim, mas ainda preferiria a temporária.... rs.

você pode fazer o select e criar/inserir em uma temoprária automaticamente. Segue o script (acrescentei apenas o INTO depois dos campos do select):

SELECT    
dbo.Funcionários.NomeDoFuncionário,
Month(dbo.Orçamento.DataDoOrçamento) As Mes,
NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento)
        When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO'
        When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO'
        When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO'
        End,
dbo.Orçamento.CódigoDoFuncionário,
ABERTO = Case When NO_Venda Is Null Then Count(Orçamento.CódigoDoFuncionário)When NO_VENDA IS NULL THEN '0' End,
FECHADO = Case When NO_Venda Is Not Null Then Count(Orçamento.CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End,
GETDATE() As DT_Imp
INTO #Temporaria
FROM        
dbo.Orçamento

INNER JOIN
dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário

GROUP BY
Month(dbo.Orçamento.DataDoOrçamento),
dbo.Funcionários.NomeDoFuncionário,
dbo.Orçamento.CódigoDoFuncionário,
NO_Venda

ORDER BY
dbo.Funcionários.NomeDoFuncionário,
Mes

select * from #Temporaria

Link to comment
Share on other sites

  • 0

Boa tarde Fulvio, sem querer te "contrariar" mas já "contrariando" rs rs rs. Acredito que com variaveis ficaria mais fácil, pois apenas somaria o valor das mesmas. Mas... hehehe sempre tem um porém, tinha pensando de fazer uma subquery para realizar o cálculo de orçamento em aberto e fechado e posteriormente atribuir o valor dessa subquery as suas respectivas variaveis. Caso eu queira fazer com variável, como eu atribuo o valor de uma subquery a variavel?

Ex:

@Aberto = (SELECT Case When NO_Venda Is Null Then Count(CódigoDoFuncionário)When NO_VENDA Is Null Then '0' End FROM dbo.Orçamento GROUP BY no_venda)

Edited by Vinicius Schuh
Link to comment
Share on other sites

  • 0

Bom dia Vinicius,

rs... contrariando nada.... as vezes para o seu problema a melhor forma será mesmo a criação de variável!! :.)

Tem como você fazer o select e atribuir o valor automaticamente... mas temos algumas restrições. Ex.:

DECLARE @Aberto int

-- Desse jeito dá certo.
SELECT @Aberto=(SELECT max(NO_VENDA) FROM Orçamento) FROM Orçamento
SELECT @Aberto

-- Desse jeito não dá certo, pois todos os valores de retorno devem ser atribuidos a uma variável.
SELECT @Aberto=(SELECT max(NO_VENDA) FROM Orçamento), NO_VENDA FROM Orçamento
SELECT @Aberto

-- Desse jeito funciona, mas todos os outros retornos devem ser associados a uma variável.
SELECT   @Aberto = (SELECT Case When NO_Venda Is Null Then 
    Count(CódigoDoFuncionário)When NO_VENDA Is Null Then 0 End FROM dbo.Orçamento GROUP BY no_venda),
dbo.Funcionários.NomeDoFuncionário,
Month(dbo.Orçamento.DataDoOrçamento) As Mes,
NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento)
        When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO'
        When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO'
        When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO'
        End,
dbo.Orçamento.CódigoDoFuncionário,
ABERTO = Case When NO_Venda Is Null Then Count(Orçamento.CódigoDoFuncionário)When NO_VENDA IS NULL THEN '0' End,
FECHADO = Case When NO_Venda Is Not Null Then Count(Orçamento.CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End,
GETDATE() As DT_Imp
FROM        
dbo.Orçamento

INNER JOIN
dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário

GROUP BY
Month(dbo.Orçamento.DataDoOrçamento),
dbo.Funcionários.NomeDoFuncionário,
dbo.Orçamento.CódigoDoFuncionário,
NO_Venda

ORDER BY
dbo.Funcionários.NomeDoFuncionário,
Mes

Link to comment
Share on other sites

  • 0

Boa tarde Fulvio, e obrigado pela explicação, mas acho que ainda estou pecando em alguma coisa... rs :wacko:

Fiz como você disse atribui os valores de retorno a variáveis, a query roda sem erro(Command(s) completed successfully.) mas não retorna nenhum valor...

O que sera que estou fazendo de errado?

Segue script.

Declare 
    @Aberto int, 
    @Fechado int, 
    @NM_Func varchar(40), 
    @ID_Func int,
    @Mes int,
    @NM_Mes varchar(15),
    @DT_Imp varchar(30)

SELECT
    @Aberto = (SELECT Case When NO_Venda Is Null Then Count(CódigoDoFuncionário)When NO_VENDA Is Null Then 0 End 
                FROM dbo.Orçamento GROUP BY no_venda),
    @Fechado = (Select Case When NO_Venda Is Not Null Then Count(CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End
                FROM dbo.Orçamento GROUP BY no_venda),
    @ID_Func =  dbo.Orçamento.CódigoDoFuncionário,
    @NM_Func = dbo.Funcionários.NomeDoFuncionário,
    @Mes = Month(dbo.Orçamento.DataDoOrçamento),
    @NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento)
                   When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO'  
                     When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO'
                      When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO' End,
    @DT_Imp = GETDATE()

FROM        
    dbo.Orçamento

INNER JOIN
    dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário

GROUP BY
    Month(dbo.Orçamento.DataDoOrçamento),
    dbo.Funcionários.NomeDoFuncionário,
    dbo.Orçamento.CódigoDoFuncionário,
    NO_Venda

ORDER BY
    dbo.Funcionários.NomeDoFuncionário,
    Month(dbo.Orçamento.DataDoOrçamento)

Edited by Vinicius Schuh
Link to comment
Share on other sites

  • 0

Boa tarde Vinicius,

rs... não tá fazendo nada de errado. Como você atribui os valores às variáveis, o sql não retorna o select, mas seta as variáveis com os valores correspondentes. Aí você faz a manipulação que desejar.....

Dá um select nas variáveis q verá os valores:

Declare
    @Aberto int,
    @Fechado int,
    @NM_Func varchar(40),
    @ID_Func int,
    @Mes int,
    @NM_Mes varchar(15),
    @DT_Imp varchar(30)

SELECT
    @Aberto = (SELECT Case When NO_Venda Is Null Then Count(CódigoDoFuncionário)When NO_VENDA Is Null Then 0 End
                FROM dbo.Orçamento GROUP BY no_venda),
    @Fechado = (Select Case When NO_Venda Is Not Null Then Count(CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End
                FROM dbo.Orçamento GROUP BY no_venda),
    @ID_Func =  dbo.Orçamento.CódigoDoFuncionário,
    @NM_Func = dbo.Funcionários.NomeDoFuncionário,
    @Mes = Month(dbo.Orçamento.DataDoOrçamento),
    @NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento)
                   When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO'  
                     When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO'
                      When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO' End,
    @DT_Imp = GETDATE()

FROM        
    dbo.Orçamento

INNER JOIN
    dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário

GROUP BY
    Month(dbo.Orçamento.DataDoOrçamento),
    dbo.Funcionários.NomeDoFuncionário,
    dbo.Orçamento.CódigoDoFuncionário,
    NO_Venda

ORDER BY
    dbo.Funcionários.NomeDoFuncionário,
    Month(dbo.Orçamento.DataDoOrçamento)
    
SELECT @Aberto
SELECT @Fechado
SELECT @NM_Func
SELECT @ID_Func
SELECT @Mes
SELECT @NM_Mes
SELECT @DT_Imp

Link to comment
Share on other sites

  • 0

Fulvio do céu, tava feliz já quando falei que ia parar de te encomodar né? rsrsrs Mas parçeiro, não está fácil de fazer funcionar 100% esse script.

Agora me deparei com a seguinte situação, se eu tenho apenas orçamentos em ABERTO ou apenas FECHADOS, tranquilo

Mas caso eu tenha as duas situações ocorre o seguinte erro:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

(1 row(s) affected)

eu adicionei mais uma variável para realizar a soma dos orçamentos em aberto e fechado, segue script:

USE Local_28
GO

Declare 
    @Aberto int, 
    @Fechado int, 
    @ID_Func int,
    @NM_Func varchar(40), 
    @Mes int,
    @NM_Mes varchar(15),
    @DT_Imp varchar(30),
    @Total numeric
SELECT
    @Aberto = (SELECT Case When NO_Venda Is Null Then Count(CódigoDoFuncionário)When NO_VENDA Is Null Then 0 End 
                FROM dbo.Orçamento GROUP BY no_venda),
    @Fechado = (Select Case When NO_Venda Is Not Null Then Count(CódigoDoFuncionário) When NO_VENDA IS NULL THEN '0' End
                FROM dbo.Orçamento GROUP BY no_venda),
    @ID_Func =  dbo.Orçamento.CódigoDoFuncionário,
    @NM_Func = dbo.Funcionários.NomeDoFuncionário,
    @Mes = Month(dbo.Orçamento.DataDoOrçamento),
    @NM_Mes = Case Month(dbo.Orçamento.DataDoOrçamento)
                When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO'
                When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO'
                When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO'
             End,
    @DT_Imp = GETDATE(),
    @Total = (@Fechado + @Aberto)
FROM        
    dbo.Orçamento
INNER JOIN
    dbo.Funcionários On dbo.Orçamento.CódigoDoFuncionário = dbo.Funcionários.CódigoDoFuncionário
GROUP BY
    Month(dbo.Orçamento.DataDoOrçamento),
    dbo.Funcionários.NomeDoFuncionário,
    dbo.Orçamento.CódigoDoFuncionário,
    NO_Venda
ORDER BY
    dbo.Funcionários.NomeDoFuncionário,
    Month(dbo.Orçamento.DataDoOrçamento)
    
SELECT 
    @Aberto, @Fechado, @Total, @ID_Func, @NM_Func, @Mes, @NM_Mes, @DT_Imp

É algo na parametrização do meu script? :(

Link to comment
Share on other sites

  • 0

Bom dia Vinicius,

A resposta demorou um pouco porque estava de férias.... rs.

O erro não está relacionada a parametrização. Um dos seus subselects estão retornando mais de 1 valor. Esta forma, o erro descrito acima ocorre.

Execute os subselects a parte e identifique qual está retornando mais de 1 valor.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...