Sintaxe da soma em um Select
É 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.
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
Curtidas 0
Melhor post
Chromusmaster
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:
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:
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
GOSTEI 1
Mais Respostas
Chromusmaster
11/04/2019
É 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.
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
GOSTEI 0
Chromusmaster
11/04/2019
Um adendo, cometi um equivoco no final, a consulta. Segue correção:
SELECT sum(valor1 + valor2) FROM tab
GOSTEI 0
Kleber Santos
11/04/2019
É 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.
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'.
GOSTEI 0
Emerson Nascimento
11/04/2019
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.
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.
GOSTEI 0
Kleber Santos
11/04/2019
Essa é a query
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.
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.
GOSTEI 0
Chromusmaster
11/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:
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:
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
GOSTEI 0
Kleber Santos
11/04/2019
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.
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.
GOSTEI 0
Kleber Santos
11/04/2019
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.
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
GOSTEI 0
Chromusmaster
11/04/2019
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).
GOSTEI 1
Emerson Nascimento
11/04/2019
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
GOSTEI 1
Kleber Santos
11/04/2019
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.
GOSTEI 0