如果没有你想怎么你的输出也很难知道您打算什么一个例子,但:具有作为发挥体育列
和列应包含的球员的名字排序递增
你并不需要使用PIVOT
,您可以使用LISTAGG
:
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE TABLE players (Name, Sport_played) AS
SELECT 'Ravi', 'Cricket' FROM DUAL UNION ALL
SELECT 'Raju', 'Cricket' FROM DUAL UNION ALL
SELECT 'Ronaldo', 'Football' FROM DUAL UNION ALL
SELECT 'Messi', 'Football' FROM DUAL UNION ALL
SELECT 'Anand', 'Chess' FROM DUAL;
查询1:
SELECT sport_played,
LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) As names
FROM players
GROUP BY sport_played
Results:
| SPORT_PLAYED | NAMES |
|--------------|---------------|
| Chess | Anand |
| Cricket | Raju,Ravi |
| Football | Messi,Ronaldo |
更新:
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE TABLE players (Name, Sport_played) AS
SELECT 'Ravi', 'Cricket' FROM DUAL UNION ALL
SELECT 'Raju', 'Cricket' FROM DUAL UNION ALL
SELECT 'Ronaldo', 'Football' FROM DUAL UNION ALL
SELECT 'Messi', 'Football' FROM DUAL UNION ALL
SELECT 'Anand', 'Chess' FROM DUAL;
查询1:
SELECT *
FROM (SELECT p.*,
ROW_NUMBER() OVER (PARTITION BY Sport_played
ORDER BY name) AS rn
FROM players p)
PIVOT (
MAX(Name)
FOR Sport_Played IN (
'Cricket' As Cricket,
'Football' As Football,
'Chess' AS Chess
)
)
Results:
| RN | CRICKET | FOOTBALL | CHESS |
|----|---------|----------|--------|
| 1 | Raju | Messi | Anand |
| 2 | Ravi | Ronaldo | (null) |
您可以使用在PIVOT
包括MAX(name)
,MIN(name)
甚至LISTAGG(name, ',') WITHIN GROUP (ORDER BY Name)
任何(串)聚集功能。 ROW_NUMBER()
分析函数将生成一个唯一的每运动数,因此聚合函数将只能在单个值上运行,因此使用什么聚合函数并不重要。
“有栏作为体育运动,列应包含球员的名字”你已经有这两列;为什么你需要一个数据透视表,而不仅仅是对结果集进行排序? – MT0
我正在学习关键。只是想实现它 –
请用[MCVE]更新您的问题,包括样本数据的预期输出示例。 – MT0