各カテゴリの言及回数
SELECT category, COUNT(*) AS cat_count
FROM anonymous_table
GROUP BY category
要求どおりにソートされたデータ
SELECT a.category, a.name
FROM anonymous_table AS a
JOIN (SELECT category, COUNT(*) AS cat_count
FROM anonymous_table
GROUP BY category
) AS c ON a.category = c.category
ORDER BY c.cat_count DESC, a.name
何らかの理由で、それは仕事をしていません。
上記の SQL を Informix で試したところ、「うまくいきました」が、予期しないが説明可能な答えが得られました。
Sports name1
Sports name3
Sports name7
Food name2
TV name5
Food name6
TV name8
Social name4
Food 行をグループ化するものは何もなく、名前の並べ替えにより、実際にそれらを分離する必要がありました。したがって、ORDER BY 句には追加の条件が必要です。
SELECT a.category, a.name
FROM anonymous_table AS a
JOIN (SELECT category, COUNT(*) AS cat_count
FROM anonymous_table
GROUP BY category
) AS c ON a.category = c.category
ORDER BY c.cat_count DESC, a.category, a.name;
これにより、妥当な結果が得られます。
Sports name1
Sports name3
Sports name7
Food name2
Food name6
TV name5
TV name8
Social name4
食事の前にテレビが必要な場合は、そのための注文方法を考え出す必要があります。この例では、カテゴリの降順で並べ替えることができます。異なるカテゴリの準任意の順序付けの一般的なケースでは、カテゴリ テーブルと、他の基準が同じ:
CREATE TABLE Category(Name CHAR(10) NOT NULL PRIMARY KEY, Ordering INTEGER NOT NULL);
INSERT INTO Category(Name, Ordering) VALUES('Sports', 10);
INSERT INTO Category(Name, Ordering) VALUES('TV', 20);
INSERT INTO Category(Name, Ordering) VALUES('Food', 30);
INSERT INTO Category(Name, Ordering) VALUES('Social', 40);
SELECT a.category, a.name
FROM anonymous_table AS a
JOIN category AS b ON a.category = b.name
JOIN (SELECT category, COUNT(*) AS cat_count
FROM anonymous_table
GROUP BY category
) AS c ON a.category = c.category
ORDER BY c.cat_count DESC, b.ordering, a.category, a.name;
Category.Name 列には一意の制約がないため、正しいグループ化を確実にするために、カテゴリごとに並べ替える必要があります (ただし、一意の制約を追加a.category
してから、ORDER BY 句から用語を削除することもできます)。