[MSSQL] Records teruggeven met hoogste aantal

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 24-09 11:36
Ik heb de volgende query

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT     
    dbo.Contracten.ContractID, 
    dbo.Contracten.Naam, 
    dbo.TrajectGegevens.BowDoelperspectief, 
    COUNT(*) AS Aantal
FROM 
    dbo.Clientgegevens 
INNER JOIN
    dbo.TrajectGegevens 
        ON dbo.TrajectGegevens.ClientID = dbo.Clientgegevens.ID 
INNER JOIN
        dbo.Contracten 
        ON dbo.TrajectGegevens.ContractID = dbo.Contracten.ContractID
GROUP BY 
    dbo.Contracten.ContractID, 
    dbo.Contracten.Naam, 
    dbo.TrajectGegevens.BowDoelperspectief


Welke als uitkomst bijvoorbeeld onderstaand geeft:
code:
1
2
3
4
5
1   Naam1   Doelperspectief1    38
1   Naam1   Doelperspectief2    12
1   Naam1   Doelperspectief3    6
2   Naam2   Doeperspectief1     112
2   Naam2   Doelperspectief2     60


Wat ik nu wil is van deze resultataten alleen het record met de hoogste waarden terugzien. Dus het volgende resultaat wil ik krijgen
code:
1
2
1  Naam1  Doelperspectief1  38
2  Naam2  Doelperspectief1  112


Dit krijg ik alleen niet voor elkaar. Ik zit het te zoeken in MAX(), maar kom er gewoon niet uit. Iemand die me de goede richting in kan helpen?

In onderstaande richting zit ik te denken
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT 
    BowDoelperspectief, 
    ContractId, 
    MAX(Aantal)
FROM
    (
        SELECT     
            dbo.Contracten.ContractID, 
            dbo.Contracten.Naam, 
            dbo.TrajectGegevens.BowDoelperspectief, 
            COUNT(*) AS Aantal
        FROM 
            dbo.Clientgegevens 
        INNER JOIN
            dbo.TrajectGegevens 
                ON dbo.TrajectGegevens.ClientID = dbo.Clientgegevens.ID 
        INNER JOIN
                dbo.Contracten 
                ON dbo.TrajectGegevens.ContractID = dbo.Contracten.ContractID
        GROUP BY 
            dbo.Contracten.ContractID, 
            dbo.Contracten.Naam, 
            dbo.TrajectGegevens.BowDoelperspectief
    ) as tmpTabel
GROUP BY 
    ContractID, 
    BowDoelperspectief
ORDER BY ContractID

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
[search=groupwise max]
[google=groupwise max]
:)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

Je kunt iets doen met de IN operator, zoals hieronder (niet getest btw)

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT     
    dbo.Contracten.ContractID, 
    dbo.Contracten.Naam, 
    dbo.TrajectGegevens.BowDoelperspectief, 
    COUNT(*) AS Aantal
FROM 
    dbo.Clientgegevens 
INNER JOIN
    dbo.TrajectGegevens 
        ON dbo.TrajectGegevens.ClientID = dbo.Clientgegevens.ID 
INNER JOIN
        dbo.Contracten 
        ON dbo.TrajectGegevens.ContractID = dbo.Contracten.ContractID
WHERE
        dbo.Contracten.ContractID IN (
SELECT dbo.Contracten.ContractID, MAX(dbo.TrajectGegevens.BowDoelperspectief) FROM dbo.Contracten
INNER JOIN
    dbo.TrajectGegevens 
        ON dbo.TrajectGegevens.ClientID = dbo.Clientgegevens.ID 
INNER JOIN
        dbo.Contracten 
        ON dbo.TrajectGegevens.ContractID = dbo.Contracten.ContractID
GROUP BY 
    dbo.Contracten.ContractID, 
    dbo.Contracten.Naam, 
    dbo.TrajectGegevens.BowDoelperspectief
)
GROUP BY 
    dbo.Contracten.ContractID, 
    dbo.Contracten.Naam, 
    dbo.TrajectGegevens.BowDoelperspectief

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 24-09 11:36
pedorus schreef op maandag 10 november 2008 @ 14:03:
[search=groupwise max]
[google=groupwise max]
:)
Zo te lezen wordt dat alleen ondersteund in MySQL en ik gebruik MSSQL. Zit nu te zoeken naar een equivalent, maar die zie ik zo snel nog niet.

@skabouter, die query van jou werkt niet, omdat ik aan ContractID alleen niet genoeg heb. Deze zou samen moeten zijn met BowDoelPerspectief en Aantal.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Phenomenon schreef op maandag 10 november 2008 @ 14:21:
[...]
Zo te lezen wordt dat alleen ondersteund in MySQL en ik gebruik MSSQL. Zit nu te zoeken naar een equivalent, maar die zie ik zo snel nog niet.
Als je goed leest dan staan er ansi-sql oplossingen, en die werken in (bijna) alle DBMS'en.

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Het is iets lastiger omdat je eerst die count(*) gebruikt, maar dit zou ook moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
select ContractID
,      Naam
,      BowDoelperspectief
,      Aantal
from
(
    SELECT     
        dbo.Contracten.ContractID, 
        dbo.Contracten.Naam, 
        dbo.TrajectGegevens.BowDoelperspectief, 
        COUNT(*) AS Aantal
        MAX(COUNT(*)) over (partition by dbo.Contracten.ContractID) AS Max_Aantal
    FROM 
        dbo.Clientgegevens 
    INNER JOIN
        dbo.TrajectGegevens 
            ON dbo.TrajectGegevens.ClientID = dbo.Clientgegevens.ID 
    INNER JOIN
            dbo.Contracten 
            ON dbo.TrajectGegevens.ContractID = dbo.Contracten.ContractID
    GROUP BY 
        dbo.Contracten.ContractID, 
        dbo.Contracten.Naam, 
        dbo.TrajectGegevens.BowDoelperspectief
)
where  Aantal = Max_Aantal

[ Voor 7% gewijzigd door winkbrace op 10-11-2008 17:58 ]

Pagina: 1