SQL Group by -両方の列を選択します
質問
次の列を含むユーザーのテーブルがあります。
| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) |
SQLクエリを作成して、年齢と経験の組み合わせでユニークではない人のすべてのIDを出力したいと思います。
これまでの私のコード:
SELECT Count(*), User_ID FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
明らかにこれは不完全であり、これは非ユニークユーザーをグループ化しますが、すべてのuser_idsを教えてくれません。
よろしくお願いします!
解決
否定されたロジッククエリは次のとおりです。
SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)
他のヒント
複数のユーザーのグループに関する情報が必要なので、このデータをどのように返したいですか? user_id値のコンマ区切りリストを含む文字列に?
使用するSQLデータベースのブランドに質問にタグを付けませんでした。
mysqlまたはsqliteを使用する場合、内蔵を使用できます GROUP_CONCAT()
働き:
SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
デフォルトでは、 GROUP_CONCAT()
値をコンマで分離します。別の方法でフォーマットしたい場合は、マニュアルを参照してください。
他のSQLベンダーには他のソリューションがあります。この質問は、スタックオーバーフローで何度も発生しました。
SELECT t.User_ID, t.Age, t.Experience_Level
FROM Users t INNER JOIN
(SELECT Age, Experience_Level
FROM Users
GROUP BY Age, Experience_Level
HAVING Count(*) > 1) d ON t.Age = d.Age AND t.Experience_Level = d.Experience_Level
テストスクリプト:
create table Users (
User_ID int,
Name varchar(50),
Age int,
Experience_Level int
)
insert into Users (User_ID, Name, Age, Experience_Level) values (1, 'A', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (2, 'B', 37, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (3, 'C', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (4, 'D', 35, 2)
insert into Users (User_ID, Name, Age, Experience_Level) values (5, 'E', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (6, 'F', 35, 2)
insert into Users (User_ID, Name, Age, Experience_Level) values (7, 'G', 18, 1)
理論的には、あなたが望むのはこのようなものですが、残念ながらSQLサーバーはそれを許可していません。
SELECT * FROM Users
WHERE (Age, Experience_Level) IN
(
SELECT Age, Experience_Level
FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
)
代わりに、あなたはサブクエリへの参加に落ち着かなければなりません:
SELECT Users.* FROM Users
INNER JOIN
(
SELECT Age, Experience_Level
FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
) subq
ON Users.Age = subq.Age
AND Users.Experience_Level = subq.Experience_Level
所属していません StackOverflow