Problemas em um selectp

SQL

MySQL

03/08/2018

Estou montando um sistema de controle de ordem de servico, onde tem a coluna datasolicitacao e dataconclusao e tenho que montar um grafico onde tenho que contar as ordem de servico solicitadas e concluidas e agrupar por mes mas no group by tenho que escolher somente uma das datas ai nao conta as os corretamente. Exemplo a ordem criada no mes anterior e concluida em outro mes nao conta corretamente, so conta quando as duas estao no mesmo mes
Leonardo Alves

Leonardo Alves

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

06/08/2018

tente assim:
SELECT d.ano, d.mes,
  SUM(CASE WHEN year(os.dataAutorizacao) = d.ano and month(os.dataAutorizacao) = d.mes THEN 1 ELSE 0 END) autorizadas, 
  SUM(CASE WHEN year(os.dataConclusao)   = d.ano and month(os.dataConclusao)   = d.mes THEN 1 ELSE 0 END) concluidas
FROM
(SELECT
   year(dataAutorizacao) ano, month(dataAutorizacao) mes
 FROM manutencao_OS
 WHERE dataAutorizacao is not null
 GROUP BY 1, 2
 UNION
 SELECT
   year(dataConclusao) ano, month(dataConclusao) mes
 FROM manutencao_OS
 WHERE dataConclusao is not null
 GROUP BY 1, 2
) d
LEFT JOIN manutencao_OS os on
  (year(os.dataAutorizacao) = d.ano and month(os.dataAutorizacao) = d.mes)
  or (year(os.dataConclusao) = d.ano and month(os.dataConclusao) = d.mes)
GROUP BY d.ano, d.mes
ORDER BY d.ano, d.mes
GOSTEI 1

Mais Respostas

Luciano

Luciano

03/08/2018

Enviai o SELECT pra a gente dar uma olhada.
GOSTEI 0
Leonardo Alves

Leonardo Alves

03/08/2018

SELECT
count(os.dataAutorizacao) as autorizacao,
count(os.dataConclusao) as concluida,
(CASE month(dataAutorizacao)
when 1 then 'Jan'
when 2 then 'Fev'
when 3 then 'Mar'
when 4 then 'Abr'
when 5 then 'Mai'
when 6 then 'Jun'
when 7 then 'Jul'
when 8 then 'Ago'
when 9 then 'Set'
when 10 then 'Out'
when 11 then 'Nov'
when 12 then 'Dez'
END) as meses,
year(dataAutorizacao) AS ano
FROM manutencao_OS os
inner join manutencao_local l on (l.idlocal = os.local)
where os.dataAutorizacao is not null
GROUP BY month(os.dataAutorizacao)
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/08/2018

tente assim:
SELECT
  year(dataAutorizacao) AS ano,
  (CASE month(dataAutorizacao) 
   when 1 then 'Jan'
   when 2 then 'Fev'
   when 3 then 'Mar'
   when 4 then 'Abr'
   when 5 then 'Mai'
   when 6 then 'Jun'
   when 7 then 'Jul'
   when 8 then 'Ago'
   when 9 then 'Set'
   when 10 then 'Out'
   when 11 then 'Nov'
   when 12 then 'Dez'
   END) as mes,
   count(os.dataAutorizacao) as autorizadas,
   sum(case when dataConclusao is null then 0 else 1 end) as concluidas
FROM manutencao_OS os
inner join manutencao_local l on (l.idlocal = os.local)
where os.dataAutorizacao is not null
GROUP BY year(dataAutorizacao), month(os.dataAutorizacao)

desta forma serão contadas todas as OS autorizadas no mês, e a contagem OS concluídas será aquela aberta dentro do mês, independente da data de conclusão.

GOSTEI 0
Leonardo Alves

Leonardo Alves

03/08/2018

mas preciso contar quantas os concluídas tem determinado mes
GOSTEI 0
Leonardo Alves

Leonardo Alves

03/08/2018

TIPO ASSIM
SELECT count(dataConclusao) as autorizada FROM los_interno.manutencao_OS where month(dataConclusao) = 8 and year(dataConclusao) = 2018

RESULTADO = 27

E NO SELECT ANTERIOR DA RESULTADO = 13
GOSTEI 0
Luciano

Luciano

03/08/2018

Não entendi. Você já escolheu a Melhor Resposta, Leonardo. Significa que já conseguiu ou ainda precisa de ajustes na query enviada por Emerson?

Qualquer coisa, me avisa.

;-)
GOSTEI 0
POSTAR