---
title: "Funktion för att plocka ut vinnare/förlorare"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/138660-funktion-för-att-plocka-ut-vinnare-förlorare"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Obbelix"
published: "2005-12-02T16:16:44.000Z"
updated: "2005-12-05T10:39:17.000Z"
replies: 11
views: 475
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/138660-funktion-för-att-plocka-ut-vinnare-förlorare"
---

# Funktion för att plocka ut vinnare/förlorare

## #1 — Obbelix, 2005-12-02T16:16Z

En helg-nöt:

Ska skapa en slutplaceringslista utifrån vinnare/förlorare i matcher.

Tabellen ser ut som följer:

```
place | win_loose | game_id
---------------------------
1       winner      903
2       looser      903
3       winner      902
4       looser      902
5       winner      837
```

Sen har jag en tabell med alla matcher:

```
game_id | home_team | away_team | home_goals | away_goals
---------------------------------------------------------
903       123         321         3            2
902       125         220         5            1
837       126         150         0            4
```

Och tabellen som håller reda på lagen:

```
id  | team_name
---------------
123   Lag 1
125   Lag 2
126   Lag 3
150   Lag 4
220   Lag 5
321   Lag 6
```

Kan man på ett smidigt sätt göra en SQL som plockar ut följande resultat?:

```
place | team_name
---------------
1       Lag 1
2       Lag 6
3       Lag 2
4       Lag 5
5       Lag 4
```

En match kan aldrig sluta oavgjort så det kommer det inte bli nåra problem med.
Använder MSSQL 2000, kanske kan använda "user defined functions" till det på nåt sätt?

Permalänk: https://www.webforum.nu/p/138660

## #2 — Melea, 2005-12-02T16:25Z

Borde väl funka med något liknande

```
select
   sp.place,
   l.team_name
from
   slutplacering sp
left join
   matcher m on sp.game_id = m.game_id
left join
   lagen l on m.home_team = l.id
```

**/red**

Nehedu, det där funkar inge vidare ser jag nu.
Återkommer!

Permalänk: https://www.webforum.nu/p/1721057

## #3 — Melea, 2005-12-02T16:45Z

Uhm, du får nog bygga om din databasstruktur, där du har lagets id i placeringstabellen.

Permalänk: https://www.webforum.nu/p/1721069

## #4 — Obbelix, 2005-12-02T16:54Z

Grejen är den att man innan matcherna spelas ska kunna definera vilka som kommer vart i slutplaceringen. Man kan ju gå den långa vägen och kolla varje rad i placeringslistan och då kolla vilket lag som har fler mål än det andra i match-tabellen osv. Men OM det går att lösa på ett smidigare sätt vore det ju kanon!

Permalänk: https://www.webforum.nu/p/1721072

## #5 — Peter S, 2005-12-02T21:47Z

Jag är osäker på om man kan göra så här:

```
select p.place
     , l.team_name
  from placering p
inner
  join match m
    on p.game_id = m.game_id
inner
  join lag l
    on l.id = case
               when p.win_loose = 'winner' then m.home_team
               else m.away_team
              end
order
    by p.place
```

Permalänk: https://www.webforum.nu/p/1721196

## #6 — Obbelix, 2005-12-04T18:04Z

Nja. Det kanske är en bra början, men på nåt ställe måste ju home_goals jämföras med away_goals så man vet vilket lag som vunnit.

Permalänk: https://www.webforum.nu/p/1721865

## #7 — LarsG, 2005-12-04T19:57Z

Jag förstär inte vad den första tabellen har för funktion. 

För att få fram lagen sorterat med avseende på antal vinster

```
select team_name,
   (select count(*)
      from games
     where (home_team = t.id
       and home_goals > away_goals)
        or (away_team = t.id
       and away_goals > home_goals)) as wins
  from teams t
  order by win desc
```

Permalänk: https://www.webforum.nu/p/1721898

## #8 — Obbelix, 2005-12-04T23:24Z

Den första tabellen har till funktion att definera placeringar i en turnering. Den som vinner match (game_id) 903 är alltså etta (1), tvåan är förloraren i samma match osv.
Detta ska göras så att man allt eftersom matcherna spelas klart ska kunna se på vilken plats respeltive lag kommer på.

Det är alltså ingen vanlig serie med en tabell utan utslagsmatcher som spelas. Därav denna placeringslista.

Permalänk: https://www.webforum.nu/p/1721970

## #9 — LarsG, 2005-12-05T09:26Z

```
select p.place
     , l.team_name
  from placering p
  join match m
    on p.game_id = m.game_id
  join lag l on l.id = 
  case when (p.win_loose = 'winner' and home_goals > away_goals)
              or (p.win_loose = 'looser' and home_goals < away_goals) then 
                   m.home_team
          else m.away_team
  end
order by p.place
```

Permalänk: https://www.webforum.nu/p/1722064

## #10 — Obbelix, 2005-12-05T09:39Z

Jag kom precis fram till en lösning, men den kanske är sämre än den du (LarsG) föreslog?
Fördelar/nackdelar med den jag gjort?

```
select p.place
     , l.team_name
  from placering p
  inner join match m
    on p.game_id = m.game_id
  inner join lag l on l.id = 
  case when p.win_loose = 'winner' AND m.home_goals > m.away_goals then m.home_team
       when p.win_loose = 'looser' AND m.home_goals < m.away_goals then m.home_team
  else m.away_team
  end
order by p.place
```

Permalänk: https://www.webforum.nu/p/1722072

## #11 — LarsG, 2005-12-05T09:58Z

Dom torde vara likvärdiga (prestandamässigt förmodar jag att du avser).

Permalänk: https://www.webforum.nu/p/1722081

## #12 — Obbelix, 2005-12-05T10:39Z

Ok, då kör jag på den jag gjorde :)

Tack för all hjälp på traven!

Permalänk: https://www.webforum.nu/p/1722097

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/138660-funktion-för-att-plocka-ut-vinnare-förlorare
