申し訳ありませんが、最初は SQLFiddle に関するコメントを理解できませんでした。そこでコードをテストしたところ、さらに修正する必要があることがわかりました。
クエリでは、最後の group-by 式から集計に n* 列を移動する必要があり、最初の FROM と 2 番目の SELECT の間に ( と COUNT( ) > 2 ではなく COUNT( ) >= 2 を配置する必要がありました。
テストコードで実行すると、動作します。
テストの URL は次のとおりですhttp://sqlfiddle.com/#!2/9e3cb/21/0
正解:
SELECT id, MAX(n1) n1, MAX(n2) n2, MAX(n3) n3, MAX(n4) n4, MAX(n5) n5,
MAX(n6) n6, MAX(n7) n7, MAX(n8) n8, MAX(n9) n9, MAX(n10) n10,
MAX(GrpSize) Max, COUNT(GrpNumber) Sets
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, GrpNumber, COUNT(*) GrpSize
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,
CASE Numbers.N
WHEN 1 THEN n1 - N
WHEN 2 THEN n2 - N
WHEN 3 THEN n3 - N
WHEN 4 THEN n4 - N
WHEN 5 THEN n5 - N
WHEN 6 THEN n6 - N
WHEN 7 THEN n7 - N
WHEN 8 THEN n8 - N
WHEN 9 THEN n9 - N
WHEN 10 THEN n10 - N
END GrpNumber
FROM `mytbl`
CROSS JOIN (
SELECT 1 AS N UNION ALL
SELECT 2 AS N UNION ALL
SELECT 3 AS N UNION ALL
SELECT 4 AS N UNION ALL
SELECT 5 AS N UNION ALL
SELECT 6 AS N UNION ALL
SELECT 7 AS N UNION ALL
SELECT 8 AS N UNION ALL
SELECT 9 AS N UNION ALL
SELECT 10 AS N
) Numbers
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber
HAVING COUNT(*) >= 2
) TT
GROUP BY id
元の回答:
セットベースのクエリでそれを行う方法は次のとおりです。このクエリでは、テーブルの名前が TableOfTen であり、正確に 10 個の n[数][1..10] 列があると想定しています。n[number][...] 列の数が事前にわかっている任意のテーブル (または派生テーブル) に対して変更できます。
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, MAX(GrpSize) MaxSize, COUNT(GrpNumber) NumberOfSetsWithTwoOrMoreMembers
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber, COUNT(*) GrpSize
FROM
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,
CASE Numbers.N
WHEN 1 THEN n1 - N
WHEN 2 THEN n2 - N
WHEN 3 THEN n3 - N
WHEN 4 THEN n4 - N
WHEN 5 THEN n5 - N
WHEN 6 THEN n6 - N
WHEN 7 THEN n7 - N
WHEN 8 THEN n8 - N
WHEN 9 THEN n9 - N
WHEN 10 THEN n10 - N
END GrpNumber
FROM `mytbl`
CROSS JOIN (
SELECT 1 AS N UNION ALL
SELECT 2 AS N UNION ALL
SELECT 3 AS N UNION ALL
SELECT 4 AS N UNION ALL
SELECT 5 AS N UNION ALL
SELECT 6 AS N UNION ALL
SELECT 7 AS N UNION ALL
SELECT 8 AS N UNION ALL
SELECT 9 AS N UNION ALL
SELECT 10 AS N
) Numbers
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber
HAVING COUNT(*) > 2
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10