3

次のようなテーブルがあります。

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

あなたはそれを正しく推測しました!バレーボールの試合です!ただし、出力を1行にしたいと思います。例えば:

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

上記の形式をユーザーが見やすい形式に改良するには、何らかの自己結合が必要になります...詳細が必要な場合はお知らせください。

ありがとう、

4

4 に答える 4

7

クエリは次のようになります。

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;

datesetは、かなり残念な列名です。

クエリは 3 つのステップで機能します。

  1. 記録は集計され、チームと試合ごとに 1 つの行が作成されます。そのプロセスでは、スコアは set_1、set_2、set_3 の 3 つの列のいずれかに割り当てられます。
  2. 行番号は、一致ごとに 1 から始まる各行に割り当てられます。その結果、1 つのチームに 1 が割り当てられ、もう 1 つのチームには 2 が割り当てられます (列 team_no)。
  3. 結果のテーブルはそれ自体に結合され、チームの左側は no. 1とないチームの右側。2 一致(日付とコード)を結合条件として使用します。結果は、試合ごとに 1 行で、両チームの名前とスコアが表示されます。
于 2012-11-06T19:21:16.570 に答える
2

まず、データ"date", code, "set"LISTAGGチームとスコアでグループ化します。次に、スコア列で結果をピボットします。そのための 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
;

このクエリもSQL Fiddleでご覧ください。

于 2012-11-06T20:22:35.510 に答える
1

結合を必要とせずに必要な結果を返すには、次のことを試してください。

select "date", 
       code, 
       min_name || ' VS. ' || max_name teams,
       sum(case when "set" = 1 and name = min_name then score end) || '-' || 
          sum(case when "set" = 1 and name = max_name then score end) "Set-1",
       sum(case when "set" = 2 and name = min_name then score end) || '-' || 
          sum(case when "set" = 2 and name = max_name then score end) "Set-2",
       sum(case when "set" = 3 and name = min_name then score end) || '-' || 
          sum(case when "set" = 3 and name = max_name then score end) "Set-3"
from (select g.*,
             min(name) over (partition by "date", code) min_name,
             max(name) over (partition by "date", code) max_name
      from games)
group by "date", code
于 2012-11-06T20:11:53.577 に答える
1

テーブルの名前が VOLLEYBALL の場合、次のようにします。

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 行の要約が生成されます。

于 2012-11-06T19:26:15.563 に答える