Sintaxe da soma em um Select
11/04/2019
0
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
Post mais votado
12/04/2019
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
Mais Posts
11/04/2019
Chromusmaster
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
11/04/2019
Chromusmaster
SELECT sum(valor1 + valor2) FROM tab
11/04/2019
Kleber Santos
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'.
11/04/2019
Emerson Nascimento
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.
12/04/2019
Kleber Santos
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.
12/04/2019
Chromusmaster
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
12/04/2019
Kleber Santos
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.
12/04/2019
Kleber Santos
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
12/04/2019
Chromusmaster
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
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.
Clique aqui para fazer login e interagir na Comunidade :)