Sintaxe da soma em um Select

11/04/2019

0

É possível fazer a soma (SUM) com o resultado do Select?

Eu tentei da seguinte maneira mas apresentou erro:

SELECT
tab.coluna1 as valor1,
tab.coluna2 as valor2,
sum(valor1 + valor2)
FROM
tab


Se for possível essa sintaxe vai me facilitar em um SELECT que utiliza CASE.
Kleber Santos

Kleber Santos

Responder

Post mais votado

12/04/2019

Pelo que entendi o erro esta dando pois você está tentando somar campos que não existem na tabela e sim foram criados na execução da consulta vide trechos:
SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,

SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,

  SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12, 

Esse foram campos criados durante a execução, eles não existem logicamente no banco. Para usar eles como campos de tabela e somá-los você pode usar da seguinte maneira:
SELECT *,
(MO12+MT12+ST12) TOTAL

FROM (SELECT DISTINCT SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
    SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
     
    --2012/2013
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12, 
    (MO12+MT12+ST12) AS TOTAL 
         
    --2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
     
    --2014/2015
     
    --2015/2016
     
    --2016/2017
     
    --2017/2018
             
FROM SMIOS INNER JOIN SMIOSXX ON (SMIOS.OS_CODIGO = SMIOSXX.OS_CODIGO) 
    INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMIOS.LOC_CODIGO = SMICL_TODAS_LOCALIZACOES.ULTIMO_COD)
    INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS.OS_CODIGO = SMIOS_HH_E_VALORES.OS_CODIGO)  
WHERE
    SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7
GROUP BY
    SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2) TABELA
	WHERE 1=1


Chromusmaster

Chromusmaster
Responder

Mais Posts

11/04/2019

Chromusmaster

É possível fazer a soma (SUM) com o resultado do Select?

Eu tentei da seguinte maneira mas apresentou erro:

SELECT
tab.coluna1 as valor1,
tab.coluna2 as valor2,
sum(valor1 + valor2)
FROM
tab


Se for possível essa sintaxe vai me facilitar em um SELECT que utiliza CASE.


O SQL vai acusar que você precisa agrupar os campos tab.coluna1 as valor1,tab.coluna2 as valor2. Ou seja ficaria:
SELECT 
   tab.coluna1 as valor1,
   tab.coluna2 as valor2, 
   sum(valor1 + valor2)
FROM
  tab
GROUP BY  tab.coluna1 ,tab.coluna2

Porém se você quer apenas somar os dois valores, recomendo usar:
SELECT 
   sum(valor1 + valor2)
FROM
  tab
GROUP BY  tab.coluna1 ,tab.coluna2
Responder

11/04/2019

Chromusmaster

Um adendo, cometi um equivoco no final, a consulta. Segue correção:
SELECT
   sum(valor1 + valor2)
FROM
  tab
Responder

11/04/2019

Kleber Santos

É possível fazer a soma (SUM) com o resultado do Select?

Eu tentei da seguinte maneira mas apresentou erro:

SELECT
tab.coluna1 as valor1,
tab.coluna2 as valor2,
sum(valor1 + valor2)
FROM
tab


Se for possível essa sintaxe vai me facilitar em um SELECT que utiliza CASE.


O SQL vai acusar que você precisa agrupar os campos tab.coluna1 as valor1,tab.coluna2 as valor2. Ou seja ficaria:
SELECT 
   tab.coluna1 as valor1,
   tab.coluna2 as valor2, 
   sum(valor1 + valor2)
FROM
  tab
GROUP BY  tab.coluna1 ,tab.coluna2

Porém se você quer apenas somar os dois valores, recomendo usar:
SELECT 
   sum(valor1 + valor2)
FROM
  tab
GROUP BY  tab.coluna1 ,tab.coluna2


Obrigado pelo retorno Chromusmaster
Realmente esqueci de add o Group by no exemplo.

Eu preciso que a sintaxe seja dessa maneira pois no lugar do tab.coluna1 eu tenho um CASE aninhado:

SELECT
   tab.coluna1 as valor1,
   tab.coluna2 as valor2, 
   sum(valor1   valor2)
FROM
  tab
GROUP BY  tab.coluna1 ,tab.coluna2


E conforme o exemplo acima apresenta o erro:

Erro ao executar a instrução SQL!
Mensagem do servidor::
[Microsoft][SQL Server Native Client 11.0][SQL Server]Nome de coluna inválido 'QTD'.
Responder

11/04/2019

Emerson Nascimento

Você precisa publicar a instrução que você está utilizando.

Há várias formas de usar um CASE dentro da instrução.
Se não soubermos como você está fazendo (demonstrando um exemplo do conteúdo da tua tabela e também do resultado que espera) vai ficar bem difícil ajudar.

Responder

12/04/2019

Kleber Santos

Essa é a query
SELECT DISTINCT SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
	SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
	
	--2012/2013
	SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
		CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
	SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
		CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
	SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
		CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
	SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
		CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12, 
	(MO12+MT12+ST12) AS TOTAL 
		
	--2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
	
	--2014/2015
	
	--2015/2016
	
	--2016/2017
	
	--2017/2018
			
FROM SMIOS INNER JOIN SMIOSXX ON (SMIOS.OS_CODIGO = SMIOSXX.OS_CODIGO) 
	INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMIOS.LOC_CODIGO = SMICL_TODAS_LOCALIZACOES.ULTIMO_COD)
	INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS.OS_CODIGO = SMIOS_HH_E_VALORES.OS_CODIGO)  
WHERE 
	SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7
GROUP BY 
	SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2
]

O código acima apresenta o seguinte erro na linha 13:
Erro ao executar a instrução SQL!
Mensagem do servidor::
[Microsoft][SQL Server Native Client 11.0][SQL Server]Nome de coluna inválido 'MO12'.

Minha dúvida está na linha 13. Existe uma sintaxe no SQL para essa operação?
Já tentei:
(MO12(mais)MT12(mais)ST12) AS TOTAL
MO12(mais)MT12(mais)ST12 AS TOTAL
4(mais)5(mais)6 AS TOTAL (posição da coluna)

A única solução eu encontrei até agora foi repetir todos os CASE novamente para ter o total por ano.
Responder

12/04/2019

Chromusmaster


Pelo que entendi o erro esta dando pois você está tentando somar campos que não existem na tabela e sim foram criados na execução da consulta vide trechos:
SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,

SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,

  SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12, 

Esse foram campos criados durante a execução, eles não existem logicamente no banco. Para usar eles como campos de tabela e somá-los você pode usar da seguinte maneira:
SELECT *,
(MO12+MT12+ST12) TOTAL

FROM (SELECT DISTINCT SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
    SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
     
    --2012/2013
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
    SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130631') THEN
        CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12,  
         
    --2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
     
    --2014/2015
     
    --2015/2016
     
    --2016/2017
     
    --2017/2018
             
FROM SMIOS INNER JOIN SMIOSXX ON (SMIOS.OS_CODIGO = SMIOSXX.OS_CODIGO) 
    INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMIOS.LOC_CODIGO = SMICL_TODAS_LOCALIZACOES.ULTIMO_COD)
    INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS.OS_CODIGO = SMIOS_HH_E_VALORES.OS_CODIGO)  
WHERE
    SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7
GROUP BY
    SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2) TABELA
	WHERE 1=1



Um adendo há um equivoco meu, esqueci de tirar o somatório de dentro da consulta e deixar apenas de fora. Segue correção
Responder

12/04/2019

Kleber Santos

Obrigado Chromusmaster.
Deu certo essa query que você me enviou, porem o tempo de execução ficou muito alto.
E analisando essa query percebi que talvez a melhor opção é fazer uma View.





Responder

12/04/2019

Kleber Santos

Obrigado Chromusmaster.
Deu certo essa query que você me enviou, porem o tempo de execução ficou muito alto.
E analisando essa query percebi que talvez a melhor opção é fazer uma View.

Analisando melhor o tempo de execução ficou igual mesmo.
A query ficou da seguinte maneira:
SELECT CIDADE, UNIDADE, HH12, MO12, MT12, ST12, (MO12+MT12+ST12) TOTAL2012,
		HH13, MO13, MT13, ST13, (MO13+MT13+ST13) TOTAL2013
 
FROM (SELECT DISTINCT SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
			SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
			  
			--2012/2013
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130131') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20120701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20130131') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12,
				  
			--2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
			  
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20130701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH13,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20130701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA) END) AS MO13,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20130701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20140631') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.34) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.34)) END) AS MT13,
			SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) >='20130701' AND convert(char(8),SMIOS.OS_DATA_R,112) <= '20140631') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.34)) END) AS ST13
			--2014/2015
			  
			--2015/2016
			  
			--2016/2017
			  
			--2017/2018
					  
		FROM SMIOS INNER JOIN SMIOSXX ON (SMIOS.OS_CODIGO = SMIOSXX.OS_CODIGO) 
			INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMIOS.LOC_CODIGO = SMICL_TODAS_LOCALIZACOES.ULTIMO_COD)
			INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS.OS_CODIGO = SMIOS_HH_E_VALORES.OS_CODIGO)  
		WHERE
			((SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7))
		GROUP BY
			SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2) TABELA
    WHERE 1=1


Me ajudou bastante
Responder

12/04/2019

Chromusmaster

Para diminuir o tempo da consulta você pode usar o (NOLOCK) antes da palavras ON nas amarrações de tabelas. Desta maneira você não trava a tabela, mas pode obter "lixos" de registro ainda não inseridos (o que ocorre quase que raramente).
Responder

12/04/2019

Emerson Nascimento

SELECT CIDADE, UNIDADE, HH12, MO12, MT12, ST12, (MO12+MT12+ST12) TOTAL2012,
        HH13, MO13, MT13, ST13, (MO13+MT13+ST13) TOTAL2013
  
FROM (
	SELECT
		SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
		SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
               
		--2012/2013
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12,
                   
		--2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA) END) AS MO13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.34) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.34)) END) AS MT13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.34)) END) AS ST13

		--2014/2015

		--2015/2016

		--2016/2017

		--2017/2018

	FROM SMIOS
	INNER JOIN SMIOSXX ON (SMIOSXX.OS_CODIGO = SMIOS.OS_CODIGO)
	INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMICL_TODAS_LOCALIZACOES.ULTIMO_COD = SMIOS.LOC_CODIGO)
	INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS_HH_E_VALORES.OS_CODIGO = SMIOS.OS_CODIGO)
	WHERE
		((SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7))
	GROUP BY
		SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2
) TABELA

Na instrução acima, retirei o DISTINCT (desnecessário porque está usando GROUP BY), retirei algumas chamadas à convert() (passei a usar BETWEEN). também retirei o WHERE 1=1, que é desnecessário.

O que você pode fazer pra aumentar a performance é criar, caso já não existam, os seguintes índices:
tabela SMIOS, campo- OS_STATUS
tabela SMIOSXX, campo OS_CODIGO
tabela SMICL_TODAS_LOCALIZACOES, campos ULTIMO_COD, TITULO1, TITULO2
tabela SMIOS_HH_E_VALORES, campo OS_CODIGO


Responder

12/04/2019

Kleber Santos

SELECT CIDADE, UNIDADE, HH12, MO12, MT12, ST12, (MO12+MT12+ST12) TOTAL2012,
        HH13, MO13, MT13, ST13, (MO13+MT13+ST13) TOTAL2013
  
FROM (
	SELECT
		SMICL_TODAS_LOCALIZACOES.TITULO1 AS CIDADE,
		SMICL_TODAS_LOCALIZACOES.TITULO2 AS UNIDADE,
               
		--2012/2013
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA * 1.44) END) AS MO12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.44) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.44)) END) AS MT12,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20120701' AND '20130131') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.44)) END) AS ST12,
                   
		--2013/2014 REPETE O CODIGO ACIMA CORRIGINDO O INPC
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.HH) END) AS HH13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),SMIOS_HH_E_VALORES.MAODEOBRA) END) AS MO13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2),(SMIOS_HH_E_VALORES.MAT * 1.06 * 1.34) + (SMIOS_HH_E_VALORES.MAT_RMA * 1.166 * 1.34)) END) AS MT13,
		SUM(CASE WHEN (convert(char(8),SMIOS.OS_DATA_R,112) BETWEEN '20130701' AND '20140631') THEN
				CONVERT(NUMERIC(10,2), (SMIOS_HH_E_VALORES.SERV * 1.06 * 1.34)) END) AS ST13

		--2014/2015

		--2015/2016

		--2016/2017

		--2017/2018

	FROM SMIOS
	INNER JOIN SMIOSXX ON (SMIOSXX.OS_CODIGO = SMIOS.OS_CODIGO)
	INNER JOIN SMICL_TODAS_LOCALIZACOES ON (SMICL_TODAS_LOCALIZACOES.ULTIMO_COD = SMIOS.LOC_CODIGO)
	INNER JOIN SMIOS_HH_E_VALORES ON (SMIOS_HH_E_VALORES.OS_CODIGO = SMIOS.OS_CODIGO)
	WHERE
		((SMIOS.OS_STATUS = 5 OR SMIOS.OS_STATUS = 7))
	GROUP BY
		SMICL_TODAS_LOCALIZACOES.TITULO1, SMICL_TODAS_LOCALIZACOES.TITULO2
) TABELA

Na instrução acima, retirei o DISTINCT (desnecessário porque está usando GROUP BY), retirei algumas chamadas à convert() (passei a usar BETWEEN). também retirei o WHERE 1=1, que é desnecessário.

O que você pode fazer pra aumentar a performance é criar, caso já não existam, os seguintes índices:
tabela SMIOS, campo- OS_STATUS
tabela SMIOSXX, campo OS_CODIGO
tabela SMICL_TODAS_LOCALIZACOES, campos ULTIMO_COD, TITULO1, TITULO2
tabela SMIOS_HH_E_VALORES, campo OS_CODIGO



Muito bom Emerson Nascimento, obrigado pelo complemento.
Responder

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

Aceitar