sql duplicate rows from concatenated columns

I have a table with 2 columns, code and country. Code is 9 characters. I would like to find all the rows in the table where the first 8 char plus the country are duplicates.
e.g.
123456781  AG
123456782  AG
123456781  BB
987654321  JM

would have concatentated values
12345678AG
12345678AG
12345678BB
98765432JM


which has the duplicate value 12345678AG
so I want to get only the records where the concatenated values are duplicated.
i.e.

123456781  AG
123456782  AG

I have used concatenation only to describe the problem.
I am fine if the solution can select these same record without concatenation.
DaveChoiceTechAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Jim HornMicrosoft SQL Server Data DudeCommented:
Give this a whirl..
SELECT LEFT(code, 8), country, COUNT(Country) as the_count
FROM YourTable
GROUP BY LEFT(code, 8), country
HAVING COUNT(Country) > 1

Open in new window

If you'd like some more reading on GROUP BY I have an image and code-heavy tutorial out there called SQL Server GROUP BY Solutions
pcelbaCommented:
More accurate solution could be this one:
SELECT * FROM YourTable
 WHERE LEFT(code, 8)+country IN (
      SELECT LEFT(code, 8)+country
        FROM YourTable
       GROUP BY LEFT(code, 8)+country
      HAVING COUNT(*) > 1)

Open in new window


MS SQL Server is OK with it. DB2? Who knows?
awking00Information Technology SpecialistCommented:
I think DB2 does not use the left function but you should be able to use the substr function in its stead.
select substr(code,1,8), country, count(*)
from yourtable
group by substr(code,1,8), country
having count(*) > 1
SolarWinds® VoIP and Network Quality Manager(VNQM)

WAN and VoIP monitoring tools that can help with troubleshooting via an intuitive web interface. Review quality of service data, including jitter, latency, packet loss, and MOS. Troubleshoot call performance and correlate call issues with WAN performance for Cisco and Avaya calls

awking00Information Technology SpecialistCommented:
I missed where youi wanted to retrieve the complete code column
select y.code, y.country
from yourtable y,
(select substr(code,1,8), country, count(*)
 from yourtable
 group by substr(code,1,8), country
 having count(*) > 1) x
where x.country = y.country
and x.code = substr(y.code,1,8);
DaveChoiceTechAuthor Commented:
Perhaps I wasn't clear. The issue is to find the rows with duplicates of the combined columns LEFT(code,8) and country.
i.e. given
123456781  AG
123456782  AG
123456781  BB
987654321  JM
987654321  BB
987654322  BB

now adding a column for the first 8 digits of the code gives.

12345678  123456781  AG
12345678  123456782  AG
12345678  123456781  BB
98765432  987654321  JM
98765432  987654321  BB
98765432  987654322  BB

Wherever the combined value of the 8 digit code plus the country are duplicated the row  from the original table should be provided.

So what I want is

123456781 AG
123456782 AG
987654321 BB
987654322 BB

Note that rows 123456781  BB, 987654321  BB and 987654321  JM are omitted since the first 8 digits of the code combined with the country code are unique.
DaveChoiceTechAuthor Commented:
Oops that final note should have been

Note that rows 123456781  BB and 987654321  JM are omitted since the first 8 digits of the code combined with the country code are unique.
awking00Information Technology SpecialistCommented:
I left out the alias, should be -
select y.code, y.country
from yourtable y,
(select substr(code,1,8) as code, country, count(*)
 from yourtable
 group by substr(code,1,8), country
 having count(*) > 1) x
where x.country = y.country
and x.code = substr(y.code,1,8)
order by 1, 2;

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
pcelbaCommented:
What query provided this result:
12345678  123456781  AG
12345678  123456782  AG
12345678  123456781  BB
98765432  987654321  JM
98765432  987654321  BB
98765432  987654322  BB
Both my and awking00's code should work without problems on MS SQL.
awking00Information Technology SpecialistCommented:
Actually, my code won't work on MS SQL as is, but could be easily modified to do so by using the substring function (i.e. not substr which is DB2) and adding the AS keyword for the alias of the table and subquery.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
DB2

From novice to tech pro — start learning today.