J'ai une table avec la structure suivante.
tbl
id name
1 AAA
2 BBB
3 BBB
4 BBB
5 AAA
6 CCC
select count(name) c from tbl
group by name having c >1
La requête renvoyant ce résultat:
AAA(2) duplicate
BBB(3) duplicate
CCC(1) not duplicate
Les noms qui sont en double comme AAA et BBB. Le résultat final, qui je veux est le compte de ces enregistrements en double.
Le résultat devrait être comme ceci: Total produits en double ( 2 )
L'approche consiste à avoir une requête imbriquée comportant une ligne par doublon et une requête externe renvoyant uniquement le nombre de résultats de la requête interne.
SELECT count(*) AS duplicate_count
FROM (
SELECT name FROM tbl
GROUP BY name HAVING COUNT(name) > 1
) AS t
pourquoi ne pas simplement envelopper ceci dans une sous-requête:
SELECT Count(*) TotalDups
FROM
(
select Name, Count(*)
from yourTable
group by name
having Count(*) > 1
) x
Voir SQL Fiddle avec Demo
Utilisez l'instruction IF pour obtenir le résultat souhaité:
SELECT name, COUNT(*) AS times, IF (COUNT(*)>1,"duplicated", "not duplicated") AS duplicated FROM <MY_TABLE> GROUP BY name
Sortie:
AAA 2 duplicated
BBB 3 duplicated
CCC 1 not duplicated
La réponse acceptée compte le nombre de lignes qui ont des doublons, pas le nombre de doublons. Si vous voulez compter le nombre réel de doublons, utilisez ceci:
SELECT COALESCE(SUM(rows) - count(1), 0) as dupes FROM(
SELECT COUNT(1) as rows
FROM `yourtable`
GROUP BY `name`
HAVING rows > 1
) x
Cela permet de totaliser les doublons dans le groupe, mais soustrait ensuite la quantité d'enregistrements ayant des doublons. La raison en est que le groupe par le total n'est pas tous les doublons, un enregistrement de chacun de ces groupes est la ligne unique.
Le code SQL est:
SELECT VERSION_ID, PROJECT_ID, VERSION_NO, COUNT(VERSION_NO) AS dup_cnt
FROM MOVEMENTS
GROUP BY VERSION_NO
HAVING (dup_cnt > 1 && PROJECT_ID = 11660)