Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


SQL: Hitta högsta betyg vid tidigaste datum för varje kurs

Postades av 2004-11-03 22:10:30 - Jonas Österlöf, i forum sql-server/msde, Tråden har 5 Kommentarer och lästs av 1037 personer

Hej!

Nu har jag (ännu en gång!) kört fast i något som känns som om det borde vara väldigt enkelt...

Jag har genom diverse UNIONS och joinar plockat ut ett resultatset som ger följande kolumner:
Kurskod|Betyg|Datum

Resultatsetet saknar primärnyckel och det är fullt möjligt att dubbletter förekommer. Jag vill nu plocka ut det högsta betyget för respektive kurskod och vid vilket datum detta nåddes. Om samma högsta betyg nåtts för samma kurskod flera gånger, ska det bara returneras den rad som innehåller det tidigaste datum det högsta betyget uppnåddes.

Om jag har raderna:
1|VG|2003-01-01
1|MVG|2003-02-02
1|MVG|2003-03-03
2|G|2003-04-04
2|G|2003-05-05

ska alltså följande returneras:
1|MVG|2003-02-02
2|G|2003-04-04

Idéer? Känns som sagt som att det borde vara enkelt, men...

MVH
/Jonas


Svara

Sv: SQL: Hitta högsta betyg vid tidigaste datum för varje kurs

Postades av 2004-11-04 09:07:03 - Johan Granfeldt

Först måste du plocka ut det bästa betyget för varje klass och sedan det lägsta datumet detta uppnåddes. Jag gjorde det första i en subselect som du ser i exemplet nedan. I subselecten finns en max-function som viktar betygen så att MVG är värt mest och 'G' minst. Om du har fler betgsnivåer får du lägga till dem här alternativt bryta ut dem och lägga dem i en tabell för extra flexibilitet.

Lycka till! //Johan


DECLARE @Betyg TABLE
(
KursKod int,
BetygKod varchar(3),
Datum smalldatetime
)

INSERT INTO @Betyg VALUES(1,'VG','2003-01-01')
INSERT INTO @Betyg VALUES(1,'MVG','2003-02-02')
INSERT INTO @Betyg VALUES(1,'MVG','2003-03-03')
INSERT INTO @Betyg VALUES(2,'G','2003-04-04')
INSERT INTO @Betyg VALUES(2,'G','2003-05-05')


SELECT KursKod = b.KursKod,
BetygKod = b.BetygKod,
Datum = Min(b.Datum)
FROM @Betyg b
INNER JOIN ( SELECT KursKod,
BetygKod = CASE Max(CASE BetygKod WHEN 'MVG' THEN 2 WHEN 'G' THEN 1 END) WHEN 2 THEN 'MVG' WHEN 1 THEN 'G' ELSE 'FEL' END
FROM @Betyg b
GROUP BY KursKod
) sub ON
sub.BetygKod = b.BetygKod
GROUP BY b.KursKod, b.BetygKod
ORDER BY KursKod


Svara

Sv: SQL: Hitta högsta betyg vid tidigaste datum för varje kurs

Postades av 2004-11-04 13:29:19 - Jonas Österlöf

Det löste det hela!
Stort tack Johan, jag hade verkligen fastnat i en felaktig tankebana.
Nu återstår bara att optimera den gigantiska query som plockar fram de tre kolumnerna... ...men det är en annan historia.

Tack än en gång!

MVH
/Jonas


Svara

Sv: SQL: Hitta högsta betyg vid tidigaste datum för varje kurs - funkar tyvärr

Postades av 2004-11-04 17:22:58 - Jonas Österlöf

Dessvärre var jag för snabb med att deklarera problemet löst...

Följande tabell returneras helt utan förändring:
Kurs|Betyg|Datum
74 1 2004-11-04 15:38:40.363
75 1 2004-11-04 15:38:40.363
75 2 2003-04-16 11:56:47.000
78 1 2004-11-04 15:38:40.363
78 2 2003-04-16 11:56:47.000
78 3 2004-06-11 13:51:39.000

Obs att betyget i verkligheten alltså anges med ett numeriskt ID, och att jag därför hoppade över Case-satsen. Den förvandlades alltså till:
<code>...BetygKod = MAX(BetygKod)...</code>
Men det kan väl inte vara problemet? Verkar snarare vara joinen.

Lägg märke till att tiden för den överflödiga raden för kurs 75 är identisk med kurs 74:s tid, som också är kurs 74:s högsta betyg/tidigaste tillfälle. Alla tidpunkter som är tidigaste tidpunkt vid högsta betyg för *vilken kurskod somhelst* kommer alltså med även för övriga kurskoder, förutsatt att även de kurskoderna faktiskt betygssatts vid den tidpunkten också.

Fler förslag? Jag har vridit och vänt på detta ett par timmar nu och är helt klart för kass på SQL för att fixa det.

MVH
/Jonas


Svara

Sv: SQL: Hitta högsta betyg vid tidigaste datum för varje kurs

Postades av 2004-11-04 19:28:03 - Jonas Österlöf

Tror jag löst det nu.

Ändrade:
<code>... sub ON
sub.BetygKod = b.BetygKod
GROUP BY...</code>

Till:
<code>... sub ON
sub.BetygKod = b.BetygKod AND sub.KursKod = b.KursKodKod
GROUP BY...</code>

Och det verkar väl rimligt.

Skulle inte kommit dit utan Johans hjälp, tack igen!
mvh
/Jonas


Svara

Sv: SQL: Hitta högsta betyg vid tidigaste datum för varje kurs

Postades av 2004-11-05 09:14:08 - Johan Granfeldt

Opps! Se där! Givetvis ska det vara så. Det gick nog lite för fort när jag skrev koden :)

//J


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
676
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies