我有一個包含列的表:child_name 和 game_name。例如:
child_name game_name
-------------------------
Phineas Monopoly
Ferb Chess
Phineas Chess
Ferb Monopoly
Raj Chess
Perry Monopoly
Candice Basketball
我想選擇既能下棋又能下大富翁的孩子(即飛哥和小佛)。我一直在考慮使用“IN”或“ALL”運算子,但無法適當地使用它們。
uj5u.com熱心網友回復:
您可以嘗試使用HAVING條件聚合函式。
查詢 1:
SELECT child_name
FROM T
GROUP BY child_name
HAVING
COUNT(CASE WHEN game_name = 'Monopoly' THEN 1 END) > 0
AND
COUNT(CASE WHEN game_name = 'Chess' THEN 1 END) > 0
結果:
| child_name |
|------------|
| Ferb |
| Phineas |
uj5u.com熱心網友回復:
這可以通過以下方式輕松完成:
SELECT child_name
FROM test_table
where game_name in ('Monopoly','Chess')
GROUP BY child_name
HAVING COUNT(distinct game_name)>=2;
結果:
child_name Ferb Phineas
演示
你也可以使用EXISTS:
SELECT child_name
FROM test_table tt
WHERE EXISTS ( select child_name
from test_table tt1
where tt1.child_name=tt.child_name
and game_name = 'Monopoly'
)
AND EXISTS ( select child_name
from test_table tt2
where tt2.child_name=tt.child_name
and game_name = 'Chess'
)
group by child_name;
演示
uj5u.com熱心網友回復:
代碼看起來像這樣
WITH COUNTING_CTE
AS
(
SELECT
*,
CASE WHEN game_name = X THEN 1
CASE WHEN game_name = Y THEN 1
ELSE 0
END AS COUNTING_COL
FROM TABLE
), MATH_CTE
AS
(
SELECT
child_name,
SUM(COUNTING_COL) TOTAL_NUM
FROM COUNTING_CTE
GROUP BY CHILD_NAME
)
SELECT
child_name
FROM MATH_CTE
WHERE 1=1
AND TOTAL_NUM >= 2
如果您愿意,也可以在“math_cte”部分中使用having子句,而不是制作另一個CTE,這只是個人喜好
uj5u.com熱心網友回復:
這是選擇可以玩所有游戲的孩子的通用解決方案。
With CTE As (
Select Child_Name, Count(Game_Name) GameCount
From GameTable
Group By Child_Name)
Select Child_Name From CTE
Where GameCount=(Select Count(Distinct Game_Name) From GameTable)
首先,我們得到所有孩子的串列以及他們可以玩的游戲數量。然后,我們只選擇那些計數與游戲總數匹配的孩子。
這適用于任何數量的兒童或游戲。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435483.html
上一篇:獲取大于1的相同狀態的記錄
