[MS SQL] select query op laatste datum

Pagina: 1
Acties:
  • 278 views sinds 30-01-2008
  • Reageer

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Ik heb een tabel met diverse documenten erin. Deze documenttabel is verbonden aan een klantentabel, zodat je weet welk document bij welke klant hoort. Ook is deze tabel aan een documenttype tabel gekoppeld. Nu wil ik een query bouwen die voor alle klanten het laatst gemaakte document ophaald die voldoet aan een bepaald documenttype. Afhankelijk van het documenttype kunnen er dus meerdere klanten worden opgehaald

Stel ik wil alle klanten ophalen met het laatst gemaakte pdf en word bestand
code:
1
2
3
4
customer   documentName   creationDate
Klant A     a.pdf        31-12-2004: 13:33
Klant A     b.word       1-11-2004: 1:40   
Klant B     c.word       1-1-2005: 15:34


Ik dacht dat ik dit misschien kon oplossen door met MAX ( creationDate ) te werken in de where clause. Dit haalt echter te veel klanten op en wordt er blijkbaar niet op creationDate gelet. Dit komt waarschijnlijk omdat deze query niet goed omgaat met het documentType.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
SELECT 
    C1.name AS customer,
    D1.documentName,
    D1.creationDate,
    DocumentType.name documentType,
FROM
    Document D1
INNER JOIN
    DocumentType
ON
    D1.documentTypeID = DocumentType.id
INNER JOIN
    xCustomerDocument x1
ON
    D1.id = x1.documentID
INNER JOIN
    Customer C1
ON
    C1.id = x1.customerID
WHERE
    D1.documentTypeID IN ( 6, 7 ) AND
    D1.documentGenerated = 
    (
    SELECT
        MAX( D2.creationDate ) 
    FROM
        Document D2
    INNER JOIN
        xCustomerDocument x2
    ON
        x2.documentID = D2.id
    INNER JOIN
        Customer C2
    ON
        C2.id = x2.customerID
    WHERE
        D2.id = D1.id AND
        C2.id = C1.id
    )

Wat ik ook kan doen is door het MAX ( createDate ) te laten schieten en de controleren op welk document het hoogste id heeft en deze te beschouwen als de laatst gemaakte maar dat vind ik een iets wat mindere oplossing. Wel kun je op deze manier op verschillende documenttypes zoeken. Zoiets als dit:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
...
WHERE
    -- BEGIN EDIT
    D1.id = 
    (
    SELECT
        TOP 1 D2.id
    FROM
        Document D2
    INNER JOIN
        xCustomerDocument x2
    ON
        x2.documentID = D2.id
    INNER JOIN
        Customer C2
    ON
        C2.id = x2.customerID
    WHERE
        D2.documentTypeID = 6 AND
        C2.id = C1.id
    ORDER BY
        D2.id DESC
    ) OR
    D1.id = 
    (
    SELECT
        TOP 1 D2.id
    FROM
        Document D2
    INNER JOIN
        xCustomerDocument x2
    ON
        x2.documentID = D2.id
    INNER JOIN
        Customer C2
    ON
        C2.id = x2.customerID
    WHERE
        D2.documentTypeID = 7 AND
        C2.id = C1.id
    ORDER BY
        D2.id DESC
    )


Deze laatste werkt wel maar is niet 100% waterdicht. Ik heb het idee dat er een makkelijkere oplossing is maar kan er niet op komen of vinden.

stp - PSN ID: stp_4


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

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
27
28
29
30
31
32
33
34
35
36
37
38
39
SELECT 
    C1.name AS customer,
    D1.documentName,
    D1.creationDate,
    DocumentType.name documentType,
FROM
    Document D1
INNER JOIN
    DocumentType
ON
    D1.documentTypeID = DocumentType.id
INNER JOIN
    xCustomerDocument x1
ON
    D1.id = x1.documentID
INNER JOIN
    Customer C1
ON
    C1.id = x1.customerID
WHERE
    D1.documentTypeID IN ( 6, 7 ) AND
    D1.documentGenerated = 
    (
    SELECT
        MAX( D2.creationDate ) 
    FROM
        Document D2
    INNER JOIN
        xCustomerDocument x2
    ON
        x2.documentID = D2.id
    INNER JOIN
        Customer C2
    ON
        C2.id = x2.customerID
    WHERE
        D2.documentTypeID = DocumentType.id AND
        C2.id = C1.id
    )

Who is John Galt?


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
justmental schreef op vrijdag 21 januari 2005 @ 17:33:
code:
1
2
3
4
5
6
SELECT 
....... 
  WHERE
        D2.documentTypeID = DocumentType.id AND
        C2.id = C1.id
    )
Bovenstaande query haalt enkel het laatste document op.

[ Voor 3% gewijzigd door stp_4 op 24-01-2005 10:12 ]

stp - PSN ID: stp_4