---
title: "joina 3 selects"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/181388-joina-3-selects"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "swingman"
published: "2009-11-25T01:05:22.000Z"
updated: "2009-11-25T18:11:40.000Z"
replies: 4
views: 438
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/181388-joina-3-selects"
---

# joina 3 selects

## #1 — swingman, 2009-11-25T01:05Z

Jag vill att dessa 3 satser nedan ska ge mig ett resultat med dessa kolumn:
Name, Running,Suspended,Completed

Hur gör jag? Jag antar att det är join ska göra men...det har inte gått bra! Hjälp!!!
Nedan är mina satser som jag vill använda.

select name\_,count(start\_)as Running
from jbpm_processdefinition d, jbpm_processinstance i
where d.id\_=i.processdefinition\_ and i.end\_ is null and i.issuspended\_=false
group by name\_;

select name\_,count(name\_) as Suspended
from jbpm_processdefinition d, jbpm_processinstance i
where d.id\_=i.processdefinition\_ AND i.issuspended\_ = 1
group by name\_;

select name\_, count(end\_) as Completed
from jbpm_processdefinition d, jbpm_processinstance i
where d.id\_=i.processdefinition\_
group by name\_;

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

## #2 — nitro2k01, 2009-11-25T02:21Z

```
SELECT 
        d.name_, 
        COUNT(DISTINCT i_r.id) AS Running, 
        COUNT(DISTINCT i_s.id) AS Suspended,
        COUNT(DISTINCT i_c.id) AS Completed

FROM      jbpm_processdefinition d
LEFT JOIN jbpm_processinstance i_r
ON        d.id_ = i_r.processdefinition_ AND i_r.end_ IS NULL AND i_r.issuspended_ = 0
LEFT JOIN jbpm_processinstance i_s
ON        d.id_ = i_s.processdefinition_ AND i_s.issuspended_ = 1
LEFT JOIN jbpm_processinstance i_c
ON        d.id_ = i_c.processdefinition_ AND i_r.end_ IS NOT NULL AND i_r.issuspended_ = 0

GROUP BY d.name_
```

Noteringar:
När man joinar flera tabeller, använder GROUP BY och COUNT på det sätt du vill måste du använda DISTINCT för att räkna rätt. Och då spelar det roll vilken kolumn du räknar på, till skillnad från vanlig COUNT. Skulle du t ex köra COUNT(DISTINCT i_r.start\_) och flera processer har precis samma starttid så kommer de räknas som en. (Endast distinkta värden räknas) Därför bör du använda jbpm_processinstance's id-kolumn för beräkningen, som koden ovan visar.

Dessutom lade jag till ett par extra villkor till Completed så att Completed väljer ut exakt det som inte väljs ut av de andra två joinarna. Jag antar att det är så du ville ha det, annars får du plocka bort de extra villkoren.

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

## #3 — LarsG, 2009-11-25T09:32Z

```
select name_,
       sum(case when i.end_ is null and i.issuspended_ <> 1 then 1 else 0 end) as Running,
       sum(case when i.issuspended_ = 1 then 1 else 0 end) as suspended,
       sum(1) as Completed
  from jbpm_processdefinition d
  join jbpm_processinstance i
    on d.id_ = i.processdefinition_
 group by name_
```

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

## #4 — swingman, 2009-11-25T10:40Z

tack så mycket

Yes... både era satser fungerarade utmärkt för mig. Jag behövde bara byta ut små grejer.
så här blev det perfekt för mig...
SELECT
        d.name\_,
        COUNT(DISTINCT i_r.id\_) AS Running,
        COUNT(DISTINCT i_s.id\_) AS Suspended,
        COUNT(DISTINCT i_c.id\_) AS Completed

FROM      jbpm_processdefinition d
LEFT JOIN jbpm_processinstance i_r
ON        d.id\_ = i_r.processdefinition\_ AND i_r.end\_ IS NULL AND i_r.issuspended\_ = 0
LEFT JOIN jbpm_processinstance i_s
ON        d.id\_ = i_s.processdefinition\_ AND i_s.issuspended\_ = 1
LEFT JOIN jbpm_processinstance i_c
ON        d.id\_ = i_c.processdefinition\_ AND i_c.end\_ IS NOT NULL AND i_c.issuspended\_ = 0

GROUP BY d.name\_;
////////////////////////////////////////////
select name\_,
       sum(case when i.end\_ is null and i.issuspended\_ \<\> 1 then 1 else 0 end) as Running,
       sum(case when i.issuspended\_ = 1 then 1 else 0 end) as suspended,
       sum(case when i.end\_ IS NOT NULL AND i.issuspended\_ = 0 then 1 else 0 end) as Completed
  from jbpm_processdefinition d
  join jbpm_processinstance i
    on d.id\_ = i.processdefinition\_
 group by name\_;

Mycket gladare nu!

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

## #5 — Sjodahl, 2009-11-25T18:11Z

Glöm inte att markera den som löst av glädje ; )

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/181388-joina-3-selects
