'In sql I want to a query in which it gives me the duplicates. However, i would like to see the duplicates side by side. Instead of just count

Select employee.id,count(employee. Id), employee.name
From employee_database 
Group by employee.id, employee.name 
Having count (employee.id) >1


Solution 1:[1]

This will probably help you. As Igor mentioned on points.

Select 
      e1.id,
      e1.name,
      e2.id as DupEmployeeID,
      e2.name as DupEmployeeName
   From 
      employee e1
         JOIN employee e2
            on e1.name = e2.name
           AND e1.id < e2.id
   order by
      e1.name

Sample Data

EmployeeID   Name
1            Bill
2            Mary
3            Paul
4            Bill
5            Joe
6            Mary
7            Sandy
8            Mary

Now, this will work and may need to be adjusted because of the self-join on the common part (name), and the ID of the first table is LESS than the second, will prevent comparisons such as

1 Bill   4 Bill
4 Bill   1 Bill  (this one will NOT be shown as the instance already counted for

But in situations like Mary you would get things like

2 Mary  6 Mary
2 Mary  8 Mary
6 Mary  8 Mary

Now, this might not be as practical, but if there were other information on file like an address, phone, etc, you could pull those respective columns into the query as I sampled with the original and the "DupEmployee" columns.

FEEDBACK.

I Think I got what you are looking for, per the formatted response you commented to me, I get

EmployeeID Name  Count 
1          Bill  2 
4          Bill  2 
2          Mary  3 
6          Mary  3 
8          Mary  3 
5          Joe   1 
3          Paul  1 
7          Sandy 1 

Which is a list of all names and how many instances OF that name. The basis of the sort is anyone with more than 1 show up first and in count order. Within that order, list the names alpha order. So, since there were 2 "Bill" names in my sample, those show up first as more than one. Similarly with "Mary" second and each of those entries, and finally all the individual name instances.

To do this, you need to pre-query names and counts, then join back to the original table like

select
      e1.EmployeeID,
      e1.Name,
      NameGrp.NameCnt as count
   from
      employee e1
         join ( select
                      e2.Name,
                      count(*) as NameCnt
                   from
                      Employee e2
                   group by
                      e2.Name ) NameGrp
            on e1.Name = NameGrp.Name
   order by
      case when NameGrp.NameCnt > 1 then 1 else 2 end,
      NameGrp.NameCnt,
      e1.Name

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1