首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle 11g:如何将oracle表与自身联合?

Oracle 11g:如何将oracle表与自身联合?
EN

Stack Overflow用户
提问于 2012-11-07 03:04:31
回答 4查看 1.1K关注 0票数 3

我有一个表格,如下所示:

代码语言:javascript
复制
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

你猜对了!这是一场排球赛!但是,我希望我的输出在一行中。例如:

代码语言:javascript
复制
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我知道,如果你需要更多细节。

谢谢,

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-07 03:21:17

查询可能如下所示:

代码语言:javascript
复制
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个步骤进行:

  1. 将汇总记录,以便为每个团队创建单行并进行匹配。在这个过程中,分数被分配给三列set_1、set_2、set_3中的一列。
  2. 行号被分配给每一行,每次匹配从1开始。结果是一支球队被分配了1,另一支球队被分配了2(列team_no)。
  3. 使用匹配(日期和代码)作为连接条件,将结果表连接到自身,左侧连接到编号为1的团队,右侧连接到编号为2的团队。结果是每场比赛都有一行,其中包含两支球队的名字和得分。
票数 7
EN

Stack Overflow用户

发布于 2012-11-07 04:22:36

首先,按"date", code, "set"对数据进行分组,以便对团队和分数进行LISTAGG。然后将结果旋转到scores列。下面是它的SQL语句:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2012-11-07 03:26:16

我会这样做sg,如果桌子的名字是排球:

代码语言:javascript
复制
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; 

这将产生一行摘要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13257632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档