テーブルがあり、次のような構造になっています。
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
この結果を返すクエリ:
AAA(2) duplicate
BBB(3) duplicate
CCC(1) not duplicate
AAAおよびBBBとして重複している名前。私が望む最終結果は、この重複レコードのカウントです。
結果は次のようになります:重複製品の合計(2)
アプローチは、複製ごとに1行のネストされたクエリと、内部クエリの結果のカウントのみを返す外部クエリを持つことです。
SELECT count(*) AS duplicate_count
FROM (
SELECT name FROM tbl
GROUP BY name HAVING COUNT(name) > 1
) AS t
IFステートメントを使用して、目的の出力を取得します。
SELECT name, COUNT(*) AS times, IF (COUNT(*)>1,"duplicated", "not duplicated") AS duplicated FROM <MY_TABLE> GROUP BY name
出力:
AAA 2 duplicated
BBB 3 duplicated
CCC 1 not duplicated
なぜこれをサブクエリでラップしないのですか:
SELECT Count(*) TotalDups
FROM
(
select Name, Count(*)
from yourTable
group by name
having Count(*) > 1
) x
受け入れられた回答重複がある行の数をカウントするではなく、重複の量ではありません。 重複の実際の数をカウントする場合は、これを使用します。
SELECT COALESCE(SUM(rows) - count(1), 0) as dupes FROM(
SELECT COUNT(1) as rows
FROM `yourtable`
GROUP BY `name`
HAVING rows > 1
) x
これにより、グループ内の重複が合計されますが、重複があるレコードの量が減算されます。理由は、合計によるグループがすべて重複しているわけではなく、それらのグループの各レコードが一意の行であるためです。