none
Meu having não contou registros duplicados RRS feed

  • Pergunta

  • Tenho uma tabela, com dois campos. Tipo e Valor. No campo tipo, tenho valores duplicados, veja a lista

    2 5
    4 -42
    2 2
    2 7
    3 16
    3 20

    Aí fiz o seguinte select, bem simples.

    Select tipo, value, count(tipo) as duplicado

    from Tabela group by tipo, value

    having count(tipo) > 1

    O resultado é nulo. Não mostra nada na saída da query. O que está errado na query? Mudei o count para count(*) e nada também.

    quarta-feira, 1 de julho de 2015 15:25

Respostas

  • Amigo,

    Para obter este resultado que você precisa você deve utilizar CTE.

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    DECLARE @TB_TESTE TABLE (
        Tipo	int,
        Valor	int
    )
     
    INSERT INTO @TB_TESTE VALUES
    (2, 5),
    (2, 42),
    (2, 2),
    (2, 7),
    (3, 16),
    (3, 20);
    
    --SELECT * FROM @TB_TESTE
    WITH AGRUPADO AS (
    SELECT DUP.Tipo, COUNT(DUP.Tipo) AS DUPLICADO 
    FROM @TB_TESTE AS DUP 
    GROUP BY DUP.Tipo
    HAVING COUNT(DUP.Tipo) > 1
    )
    SELECT ORIGEM.Tipo, ORIGEM.Valor, AGRUP.DUPLICADO
    FROM @TB_TESTE AS ORIGEM
    INNER JOIN AGRUPADO AS AGRUP
    ON ORIGEM.Tipo = AGRUP.Tipo
    GROUP BY ORIGEM.Tipo, ORIGEM.Valor, AGRUP.DUPLICADO
    GO
    

     

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms175972%28v=sql.120%29.aspx

    https://technet.microsoft.com/pt-br/library/ms190766(v=sql.105).aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 1 de julho de 2015 17:05
    Moderador

Todas as Respostas

  • Entendi que a coluna value está matando o having, pois se a retirar do select, funciona, porem eu preciso trazer ambas as colunas. Como eu faria então? 
    quarta-feira, 1 de julho de 2015 15:34
  • Amigo,

    Para obter este resultado que você precisa você deve utilizar CTE.

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    DECLARE @TB_TESTE TABLE (
        Tipo	int,
        Valor	int
    )
     
    INSERT INTO @TB_TESTE VALUES
    (2, 5),
    (2, 42),
    (2, 2),
    (2, 7),
    (3, 16),
    (3, 20);
    
    --SELECT * FROM @TB_TESTE
    WITH AGRUPADO AS (
    SELECT DUP.Tipo, COUNT(DUP.Tipo) AS DUPLICADO 
    FROM @TB_TESTE AS DUP 
    GROUP BY DUP.Tipo
    HAVING COUNT(DUP.Tipo) > 1
    )
    SELECT ORIGEM.Tipo, ORIGEM.Valor, AGRUP.DUPLICADO
    FROM @TB_TESTE AS ORIGEM
    INNER JOIN AGRUPADO AS AGRUP
    ON ORIGEM.Tipo = AGRUP.Tipo
    GROUP BY ORIGEM.Tipo, ORIGEM.Valor, AGRUP.DUPLICADO
    GO
    

     

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms175972%28v=sql.120%29.aspx

    https://technet.microsoft.com/pt-br/library/ms190766(v=sql.105).aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 1 de julho de 2015 17:05
    Moderador
  • Boa tarde,

    Segue outra sugestão para teste:

    with CTE_Count as
    (
        select 
            Tipo,
            Value,
            COUNT(*) OVER(PARTITION BY Tipo) as Duplicado
        from Tabela
    )
    
    select * from CTE_Count
    where Duplicado > 1

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 1 de julho de 2015 17:17
  • Deleted
    quinta-feira, 2 de julho de 2015 10:27