我有一个表格,如下所示:
date code name score set
09/09/12 967873 Team A 24 1
09/09/12 967873 Team B 22 1
09/09/12 967873 Team A 21 2
09/09/12 967873 Team B 16 2
02/04/12 965454 Team X 21 1
02/04/12 965454 Team Y 19 1
02/04/12 965454 Team X 21 2
02/04/12 965454 Team Y 19 2你猜对了!这是一场排球赛!但是,我希望我的输出在一行中。例如:
date code Teams Set-1 Set-2 Set-3
09/09/12 967873 Team A VS.Team B 24-22 21-16 -
and so on.... **Notice that the game could have a third set as well
我需要某种自我联接,以完善上述格式,以便更容易为用户view...Let我知道,如果你需要更多细节。
谢谢,
发布于 2012-11-07 03:21:17
查询可能如下所示:
with matches as (
select "DATE", code, name,
max(case when "SET" = 1 then score end) score_1,
max(case when "SET" = 2 then score end) score_2,
max(case when "SET" = 3 then score end) score_3,
row_number() over(partition by "DATE", code order by name) team_no
from games
group by "DATE", code, name
)
select a."DATE", a.code, a.name || ' vs. ' || b.name teams,
a.score_1 || '-' || b.score_1 set_1,
a.score_2 || '-' || b.score_2 set_2,
a.score_3 || '-' || b.score_3 set_3
from matches a
join matches b on a."DATE" = b."DATE" and a.code = b.code
where a.team_no = 1 and b.team_no = 2;date和set是非常不合适的列名。
查询分3个步骤进行:
发布于 2012-11-07 04:22:36
首先,按"date", code, "set"对数据进行分组,以便对团队和分数进行LISTAGG。然后将结果旋转到scores列。下面是它的SQL语句:
WITH grouped AS (
SELECT
"date", code, "set",
LISTAGG(name, ' VS. ') WITHIN GROUP (ORDER BY name) AS teams,
LISTAGG(score, '-' ) WITHIN GROUP (ORDER BY name) AS score
FROM matches
GROUP BY
"date", code, "set"
)
, pivoted AS (
SELECT
"date", code, teams,
nvl("1", '-') AS set1,
nvl("2", '-') AS set2,
nvl("3", '-') AS set3
FROM grouped
PIVOT (
MAX(score) FOR "set" IN (1, 2, 3)
) p
)
SELECT * FROM pivoted
;请也看一下这个查询at SQL Fiddle。
发布于 2012-11-07 03:26:16
我会这样做sg,如果桌子的名字是排球:
SELECT temp.date, temp.code,
temp.team1 || ' vs. ' || temp.team2 AS teams,
(SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team1 AND v.set = 1) || '-' ||
(SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team2 AND v.set = 1) AS set1,
(SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team1 AND v.set = 2) || '-' ||
(SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team2 AND v.set = 2) AS set2,
nvl((SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team1 AND v.set = 3) || '-' ||
(SELECT v.score FROM volleyball v WHERE v.code = temp.code AND v.name = team2 AND v.set = 3)
, '-') AS set3 -- optional, if no results, then it will be a '-'
FROM
(SELECT v.date, v.code,
min(v.name) AS team1, max(v.name) AS team2
FROM volleyball v
GROUP BY v.date, v.code) temp; 这将产生一行摘要。
https://stackoverflow.com/questions/13257632
复制相似问题