none
Problemas ao trazer valores corretos RRS feed

  • Pergunta

  • Boa Tarde,

     

     Estou com problemas para selecionar a quantidade total de Horas e Minutos em um determinado intervalo de data ordenando por Operador, segue abaixo script do SQL que montei:

     

    SELECT

     

    TB_OPERADOR.NOME, TB_ESPECIF.DESCRI,

    sum

     

    (datepart(hh, TB_MAN.Tempo))

    +

     

    sum(datepart(mi, TB_MAN.Tempo))/60 as [Hor H/Maq],

    sum

     

    (datepart(mi, TB_MAN.Tempo)) % 60 as [Min H/Maq]

    from

     

    TB_MAN, TB_OPERADOR, TB_ESPECIF

    WHERE

    TB_MAN

    .Data >= '20110301' AND TB_MAN.Data <= '20110311'

    AND

     

    TB_MAN.ESPECIF = TB_ESPECIF.COD

    OR

     

    TB_MAN.Mec1 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec2 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec3 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec4 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec5 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec6 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec7 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec8 = TB_OPERADOR.COD

    OR

     

    TB_MAN.Mec9 = TB_OPERADOR.COD

    GROUP

     

    BY TB_OPERADOR.NOME, TB_ESPECIF.DESCRI

    ORDER

     

    BY TB_ESPECIF.DESCRI, [Hor H/Maq] DESC, [Min H/Maq] DESC

    Onde está errado?

    Att,

    Moacir Rachid

    segunda-feira, 14 de março de 2011 17:28

Respostas

  • Rachid,

    No filtro que voce fez, devido à prioridade do operador AND sobre o Operador OR, os filtros que você especificou  com o operador AND serão resolvidos e só depois serão aplicados os filtros com o OR

    Tente mudar o seu filtro de acordo com o exemplo a seguir.

    WHERE TB_MAN.Data >= '20110301' AND TB_MAN.Data <= '20110311' 

     

    AND TB_MAN.ESPECIF = TB_ESPECIF.COD 

     

    --Abre Parenteses depois do AND

    AND ( TB_MAN.Mec1 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec2 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec3 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec4 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec5 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec6 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec7 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec8 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec9 = TB_OPERADOR.COD ) --Fecha Parenteses

    Se você tiver dúvida quanto à procedência dos operadores, dê uma olhada no site http://technet.microsoft.com/pt-br/library/ms190276.aspx

     

    Espero que ajude.

     
    • Marcado como Resposta Rachid - TI segunda-feira, 21 de março de 2011 16:25
    quinta-feira, 17 de março de 2011 00:16
  • Boa Tarde Luiz,

     

     Excelente, era isso mesmo. Agora o script está funcionando corretamente.

     

    Obrigado.

     

    Att,

    Moacir Rachid

    • Marcado como Resposta Rachid - TI segunda-feira, 21 de março de 2011 16:27
    segunda-feira, 21 de março de 2011 16:27

Todas as Respostas

  • Use este script como base. Está faltando converter o retorno do datediff para decimal...

    DROP TABLE TB_OPERADOR
    create table TB_OPERADOR (cod int, nome varchar(30))

    DROP TABLE TB_ESPECIF
    create table TB_ESPECIF (cod int, DESCRI varchar(30))

    DROP TABLE TB_MAN
    create table TB_MAN (cod int IDENTITY (1,1), ESPECIF INT, Tempo TIME, Data DATETIME)

    INSERT INTO TB_OPERADOR VALUES (1, 'JOSÉ')
    INSERT INTO TB_ESPECIF VALUES (1, 'ANÁLISE DE SISTEMAS')
    INSERT INTO TB_MAN VALUES (1, CONVERT (TIME, GETDATE()), GETDATE())

    SELECT * FROM TB_OPERADOR
    SELECT * FROM TB_ESPECIF
    SELECT * FROM TB_MAN

    SELECT
    TB_OPERADOR.NOME, TB_ESPECIF.DESCRI,
    sum (convert (numeric(13,4), datepart(hh, TB_MAN.Tempo))) + sum(convert (numeric(13,4), datepart(mi, TB_MAN.Tempo)))/60 as [Hor H/Maq],
    (sum (datepart(hh, TB_MAN.Tempo)) * 60) +  sum(datepart(mi, TB_MAN.Tempo)) as [Min H/Maq]
    from
     TB_MAN, TB_OPERADOR, TB_ESPECIF
    WHERE
     CONVERT (DATE, TB_MAN.Data) = CONVERT (DATE, GETDATE())
     AND TB_MAN.ESPECIF = TB_ESPECIF.COD
    GROUP BY
     TB_OPERADOR.NOME, TB_ESPECIF.DESCRI
    ORDER BY
     TB_ESPECIF.DESCRI, [Hor H/Maq] DESC, [Min H/Maq] DESC


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    segunda-feira, 14 de março de 2011 17:55
  • Boa Tarde,

     

     Obrigado pela atenção Weslley! O script acima não funciona, ocorre o seguinte erro:

    Msg 2715, Level 16, State 7, Line 6

    Column, parameter, or variable #3: Cannot find data type TIME.

     

    Uso o SQL Server 2005.

     

    Estou com problemas para somar quando verifico mais de uma coluna para comparar com outra tabela, parece que o banco perde a referência. O campo tempo e Data é do tipo DateTime.

    Acho que o método de uso do "OR" está incorreto! Tenho que comparar mais de uma coluna para verificar registros iguais para soma.

    Exemplo.:

     

    Registro 1 -> Tempo = 2 Hrs | Mecânico1 = José, | Mecânico2 = Paulo | Mecânico3 = Roberto

    Registro 2 -> Tempo = 1 Hrs | Mecânico1 = Paulo, | Mecânico2 = Roberto | Mecânico3 = NULL

     

    Grupo

    José = 3 Hrs

    Paulo = 3 Hrs

    Roberto = 2 Hrs

     

    Como posso resolver?

     

    Att,

    Moacir Rachid

     

    segunda-feira, 14 de março de 2011 18:10
  • Realmente o tipo TIME que eu usei existe apenas no SQL 2008.
    Enfim, no seu SELECT apenas siga este modelo:

    sum (convert (numeric(13,4), datepart(hh, TB_MAN.Tempo))) + sum(convert (numeric(13,4), datepart(mi, TB_MAN.Tempo)))/60 as [Hor H/Maq],
    (sum (datepart(hh, TB_MAN.Tempo)) * 60) +  sum(datepart(mi, TB_MAN.Tempo)) as [Min H/Maq]

    Acredito que resolva. Testa ai!


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    segunda-feira, 14 de março de 2011 20:24
  • Não resolveu, o script até funciona assim como o meu funciona, porém não está filtrando corretamente com as regras após o "WHERE".

     

    Att,

    Moacir Rachid

    segunda-feira, 14 de março de 2011 21:18
  • Certo.
    Então poste o resultado do script e diga como você esperava que retornasse.
    Se possível, poste também o DDL das tabelas pra gente simular...


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    terça-feira, 15 de março de 2011 14:05
  • Rachid,

    Você esta fazendo o filtro na claúsula Where de que forma? Quais condições você esta utilizando?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    terça-feira, 15 de março de 2011 18:52
  • Estou usando este script:

     

    SELECT TB_OPERADOR.NOME, TB_ESPECIF.DESCRI, 

     

    sum(datepart(hh, TB_MAN.Tempo))  

     

    +sum(datepart(mi, TB_MAN.Tempo))/60 as [Hor H/Maq], 

     

    sum(datepart(mi, TB_MAN.Tempo)) % 60 as [Min H/Maq] 

     

    from TB_MAN, TB_OPERADOR, TB_ESPECIF 

     

    WHERE TB_MAN.Data >= '20110301' AND TB_MAN.Data <= '20110311' 

     

    AND TB_MAN.ESPECIF = TB_ESPECIF.COD 

     

    AND TB_MAN.Mec1 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec2 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec3 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec4 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec5 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec6 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec7 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec8 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec9 = TB_OPERADOR.COD 

     

    GROUP BY TB_OPERADOR.NOME, TB_ESPECIF.DESCRI 

     

    ORDER BY TB_ESPECIF.DESCRI, [Hor H/Maq] DESC, [Min H/Maq] DESC

     

     

    A partir do OR em diante está com problemas para comparar com a tabela TB_OPERADOR.

     

    Segue abaixo estrutura das tabelas:

     

     

    CREATE TABLE [dbo].[TB_MAN](

          [cod] [int] IDENTITY(1,1) NOT NULL,

          [Data] [datetime] NULL,

          [OS] [varchar](10) NULL,

          [DescriServ] [varchar](200) NULL,

          [Maquina] [int] NULL,

          [Inicio] [datetime] NULL,

          [Fim] [datetime] NULL,

          [Tempo] [datetime] NULL,

          [TempTotal] [varchar](14) NULL,

          [Emitente] [int] NULL,

          [Mec1] [int] NULL,

          [Mec2] [int] NULL,

          [Mec3] [int] NULL,

          [Mec4] [int] NULL,

          [Mec5] [int] NULL,

          [Mec6] [int] NULL,

          [Mec7] [int] NULL,

          [Mec8] [int] NULL,

          [Mec9] [int] NULL,

          [QtdeMec] [int] NULL,

          [TIPO] [int] NULL,

          [PROCESSO] [int] NULL,

          [ESPECIF] [int] NULL

    ) ON [PRIMARY]

     

     

    CREATE TABLE [dbo].[TB_OPERADOR](

          [COD] [int] IDENTITY(1,1) NOT NULL,

          [NOME] [varchar](50) NULL

    ) ON [PRIMARY]

     

     

     

    CREATE TABLE [dbo].[TB_ESPECIF](

          [COD] [int] IDENTITY(1,1) NOT NULL,

          [DESCRI] [varchar](20) NULL

    ) ON [PRIMARY]

     

     

    O que pode ser?

     

    Att,

    Rachid

    terça-feira, 15 de março de 2011 19:53
  • Rachid,

    No filtro que voce fez, devido à prioridade do operador AND sobre o Operador OR, os filtros que você especificou  com o operador AND serão resolvidos e só depois serão aplicados os filtros com o OR

    Tente mudar o seu filtro de acordo com o exemplo a seguir.

    WHERE TB_MAN.Data >= '20110301' AND TB_MAN.Data <= '20110311' 

     

    AND TB_MAN.ESPECIF = TB_ESPECIF.COD 

     

    --Abre Parenteses depois do AND

    AND ( TB_MAN.Mec1 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec2 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec3 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec4 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec5 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec6 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec7 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec8 = TB_OPERADOR.COD 

     

    OR TB_MAN.Mec9 = TB_OPERADOR.COD ) --Fecha Parenteses

    Se você tiver dúvida quanto à procedência dos operadores, dê uma olhada no site http://technet.microsoft.com/pt-br/library/ms190276.aspx

     

    Espero que ajude.

     
    • Marcado como Resposta Rachid - TI segunda-feira, 21 de março de 2011 16:25
    quinta-feira, 17 de março de 2011 00:16
  • Boa Tarde Luiz,

     

     Excelente, era isso mesmo. Agora o script está funcionando corretamente.

     

    Obrigado.

     

    Att,

    Moacir Rachid

    • Marcado como Resposta Rachid - TI segunda-feira, 21 de março de 2011 16:27
    segunda-feira, 21 de março de 2011 16:27