Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL] Niet unieke records mergen in elkaar

Pagina: 1
Acties:

  • CrashOverDrive
  • Registratie: Augustus 2005
  • Laatst online: 00:46
Ik ben bezig om wat gegevens uit een DB (ms-sql 2005) te halen, en wil het meeste werk door sql zelf laten afhandelen, en zo min mogelijk aan de kant van de applicatie zelf gaan uitvoeren.

De data komt uit 4 tabellen, "product", "productArtistJoin", "artist" en "medium".

Het eruit halen is gelukt met wat Joins, waar het probleem nu ligt, is het feit dat er meerdere artiesten kunnen voorkomen bij een product. Wanneer dit het geval is, wil ik de "artistName" vervangen voor de tekst "v.a.".

Hieronder de query die ik gebruik om de data eruit te halen
SQL: Query
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    product.productId,
    product.title,
    product.actStock,
    medium.medium,
    artist.artistName
FROM product
LEFT JOIN medium
    ON product.mediumId = medium.mediumId
INNER JOIN productArtistJoin
    ON product.productId = productArtistJoin.productId
    JOIN artist
        ON productArtistJoin.artistId = artist.artistId


en wat voorbeeld output
productIdtitleactStockmediumartistId
5Hitzone 3025CDBritney Spears
5Hitzone 3025CDBon Jovi
5Hitzone 3025CD40 Cent
6Rock Hits11CDBruce Springsteen
6Rock Hits11CDBryan Adams
8The Reflex5CDDuran Duran


Wat ik wil bereiken::
productIdtitleactStockmediumartistId
5Hitzone 3025CDv.a.
6Rock Hits11CDv.a.
8The Reflex5CDDuran Duran

Ik wil uiteindelijk van deze output, 3 records overhouden, waarbij productId dus als `uniek` geldt.
En waarbij in het geval van een gemergde record (waarbij meerdere artiesten zaten), de tekst vervangen wordt door "v.a.".


Ik breek nu zelf al een aantal uren hier het hoofd over, en hulp is erg welkom :) , een schop de goede kant op uiteraard ook. :P

Ik heb zelf al de volgende `manieren` geprobeerd:
een DISTINCT op productId gooien, met een count eromheen, maar dit telt (uiteraard |:( ) alleen de unieke records, ik heb ongeveer het tegenovergestelde nodig.

een While loop erin , om te controleren hoevaak een id voorkwam :X , dit gaf ook allerlei rare effecten

**Edit**
ter verduidelijking, de product id's zijn uniek in de database, maar komen nu vaker tevoorschijn doordat hij gejoined wordt met meerdere artiesten (wat ik wil afvangen)

[ Voor 11% gewijzigd door CrashOverDrive op 21-10-2008 22:31 ]


  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 14-11 13:52
Geheel uit het hoofd maar zoiets?
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
SELECT
    product.productId,
    product.title,
    product.actStock,
    medium.medium,
    case 
        when count(artist.artistName) > 1 then 'V.A.'
        ELSE artist.artistName
    END
FROM
product
inner JOIN medium 
    ON product.mediumId = medium.mediumId
INNER JOIN productArtistJoin
    ON product.productId = productArtistJoin.productId
inner JOIN artist
    ON productArtistJoin.artistId = artist.artistId
group by 
    product.productId,
    product.title,
    product.actStock,
    medium.medium,
    case 
        when count(artist.artistName) > 1 then 'V.A.'
        ELSE artist.artistName
    END

  • CrashOverDrive
  • Registratie: Augustus 2005
  • Laatst online: 00:46
Ik heb het werkend gekregen, met behulp van het stukje code van Redshark :) ,
Deze query geeft exact het resultaat zoals ik had geschetst in het 2e tabelletje van me post.

SQL: Finall Query
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT DISTINCT
    product.productId,
    product.title,
    product.actStock,
    medium.medium,
    CASE
        WHEN (
            Select count(*)
            From productArtistJoin
            Where productArtistJoin.productId = product.productId ) > 1
        THEN 'V.A.'
        ELSE artist.artistName
    END
        as Artist
FROM product
INNER JOIN medium
    ON product.mediumId = medium.mediumId
INNER JOIN productArtistJoin
    ON product.productId = productArtistJoin.productId
INNER JOIN artist
    ON productArtistJoin.artistId = artist.artistId
_/-\o_

[ Voor 57% gewijzigd door CrashOverDrive op 22-10-2008 01:54 ]


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 21:57

Haan

dotnetter

offtopic:
even voor mijn nieuwsgierigheid: waarvoor staat 'v.a.' ?

Kater? Eerst water, de rest komt later


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Various Artists gok ik :)

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

Haan schreef op woensdag 22 oktober 2008 @ 08:45:
offtopic:
even voor mijn nieuwsgierigheid: waarvoor staat 'v.a.' ?
Various Artists oftwel Verschillende Artiesten

Misschien keertje refresh gebruiken voordat ik reply op een pagina die ik al een half uur open heb staan :)

[ Voor 22% gewijzigd door .Gertjan. op 22-10-2008 09:13 ]

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.

Pagina: 1