Avatar billede Jonasmp Nybegynder
02. september 2010 - 10:24 Der er 8 kommentarer og
1 løsning

Query

Jeg har en tabel som indeholder resultater, der i en forenklet udgave ser sådan ud:

TEST_ID |  TOPIC_ID | RESULT
_________________________
1    |  4      |  6.8
2    |  4      |  4.7
1    |  6      |  5.1
2    |  6      |  3.1


Jeg har nu udfordringen at lave et view der skal vise forskellen på de to test.
Altså resulatatet skal se sådan ud. ( DIFFRESULT regnes ud som test 1 - test2  for hvert topic)

TOPIC_ID |  DIFFRESULT
___________________
4    |  2.1
6    |  2.0

Har ingen Ide om hvordan jeg kan gøre det i SQL??
I det virkelige eksempel er der op til 9 test der kan blive lagt sammen eller trukket fra hinanden, men den tid den glæde :-)

På forhånd tak.

Jonas
Avatar billede janus_007 Nybegynder
02. september 2010 - 12:32 #1
I dit eksempel har du trukket dem fra hinanden, hvis du har flere test end 2, hvad skal så trækkes fra hvad?
Avatar billede Jonasmp Nybegynder
02. september 2010 - 13:40 #2
Det er lidt forskellige i forskellige situationer.
Men det er kune simple operationer som at lægge til hinanden og trække fra.
Har lavet denne query som virker, men er det den smarteste måde?

SELECT    TOPIC_ID,
                          (SELECT    result
                            FROM          test1 w
                            WHERE      w.topic_id = dbo.TEST1.topic_id AND test_id = 1) -
                          (SELECT    result
                            FROM          test1 r
                            WHERE      r.topic_id = dbo.TEST1.topic_id AND test_id = 2) AS Expr1
FROM        dbo.TEST1
GROUP BY TOPIC_ID
Avatar billede Syska Mester
02. september 2010 - 19:19 #3
SELECT TopicID, Min(Results), Max(Results) FROM Test1 GROUP BY TopicID

Overstående er ikke testet ... men det burde tage den test med flest og mindst point ... og ja, du kan jo også trække den ene fra den anden ...

SELECT TopicID, max(Results) - min(Results) as [diff] FROM Test1 GROUP BY TopicID

mvh
02. september 2010 - 19:56 #4
Hvis du for hvert topic altid har precis to tests med test_id 1 og 2 og det altid er 2erne der skal traekkes fra 1erne saa ville det vaere simpler at vise result fra test_id2 negativt og saa tage summen saaledes:

SELECT topic_id, sum(result) FROM jonasmp GROUP BY topic_id;

Hvis du gerne vil bevare vaerdierne som de er kunne du midlertidigt saette 2erne negativt, tage summen, og saette 2erne tilbage til posetivt igen. Saaledes:

UPDATE jonasmp SET result = -result WHERE test_id = 2;
SELECT topic_id, sum(result) FROM jonasmp GROUP BY topic_id;
UPDATE jonasmp SET result = -result WHERE test_id = 2;
02. september 2010 - 20:02 #5
Jeg saa ikke at buzzzz havde lavet et indlaeg mens jeg arbejdede med mit.  Jeg har ikke studeret det, men buzzzz synes at forstaa at det mindste resultat skal traekkes fra det stoerste hvorimod jeg forstod fra spoergsmaalet at 2erne skal traekkes fra 1erne, hvilket saa naturligvis kan levere en negativ sum.  Hvad siger Jonasmp?

Og saa en kommentar:  Jeg havde for test lavet en tabel kaldet jonasmp i stedet for test1, men det skal du naturligvis lave om til dit eget tabelnavn.
Avatar billede Syska Mester
02. september 2010 - 20:06 #6
Jeg så bare:
TOPIC_ID |  DIFFRESULT
___________________
4    |  2.1
6    |  2.0

Og deraf mit eks.

Men ja, skal det være på den anden måde, så skal TestID også med ud ... og så bliver man jo nød til at lave lidt join eller måske CTE.

Postede kun min da jeg synes det var en sjov løsning på et problem :-)

mvh
04. september 2010 - 22:05 #7
jonasmp, fik du mit indlaeg?  Jeg er spaendt paa din reaktion.  Jeg tillader mig at oprette dette som svar for at lette lukning hvis du skulle finde at mig indlaeg har vaeret til hjaelp.
Avatar billede Syska Mester
04. september 2010 - 22:26 #8
Gør det vel som sådan ikke lettere ... så kunne du jo ligeså godt have smidt dit første som svar :-)

Men det kræver nok lidt mere info fra ham ... før svar kan gives ...

Man kan jo også bare tage ABS af en værdi, så vil den jo også være positiv ...

mvh
04. marts 2011 - 18:19 #9
jonasmp, jeg proever lige en gang til.  Du oprettede dette spoergsmaal for et halvt aar siden, men der har ikke vaeret nogen aktivitet paa det siden to dage efter oprettelsen.  Det er uden tvivl ikke laengere aktuelt.  Kan jeg bede dig lukke det, for god ordens skyld og saa det ikke laengere staar som aabent i min (og andres) liste af indlaeg.  Hvad enten du oensker at afgive points eller du selv vil oprette et svar til at acceptere, afslut hvad du begyndte paa og luk spoergsmaalet.  Please.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester