Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

MSSQL - Hulp bij query (MAX alle kol+rij van één soort)

Pagina: 1
Acties:

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
Beste Tweakers,

Wie weet de oplossing? Ik zoek een query (MSSQL) waarmee ik van onderstaande tabel:

Afbeeldingslocatie: http://lumatronix.nl/FOK/SQL_vraag.png

de volgende output krijg:

code:
1
2
3
rec123a | 4-1-2013 | 3
bel11   | 8-5-2014 | 4
acc99   | 2-2-2014 | 2 (mag ook andere datum aangezien er meerdere kolommen met "2" zijn)


Dus per unieke "AC_NR" komt er één (alleen de MAX) waarde uit, de bijbehorende datum en de waarde zelf.
Dacht dat het zo te doen was, maar ben er inmiddels al veel te lang mee bezig, dus vandaar mijn hulpkreet hier.

Ik weet dat het iets met zijn met MAX (GREATEST is er helaas niet bij bij MSSQL) en dan allemaal die "V" kolommen achter elkaar, maar hoe zorg je dan dat je de bijbehorende datum krijgt? En hoe zit die query sowieso in elkaar?

Heeft het nut om alles hier neer te zetten wat ik al geprobeerd heb? (Notepad vol, enkele pagina's diep >:) ) en ik durf het ook niet te posten eerlijk gezegd, want er zit echt "sjrot" bij O-)

Thanks voor 't meedenken _/-\o_


[edit]

Naar aanleiding van de post van RobIII:

De beste "kanshebber" c.q. een béétje werkende query is:

code:
1
2
3
4
5
6
7
8
9
10
    Select  Hoogste = MAX(Hoogste) from (
    Select  MAX(V00) As Hoogste from TBL where AC_NR = 'bel11' UNION ALL
    Select MAX(V01) from TBL where AC_NR = 'bel11' 
    UNION ALL
    Select MAX(V02) from TBL where AC_NR = 'bel11' 
    UNION ALL
    Select MAX(V03) from TBL where AC_NR = 'bel11' )x  
    
    
    /*GROUP BY Hoogste*/


Maar dat specificeer ik zelf een "AC_NR" die ik wil hebben, en ik krijg het echt niet voor elkaar om de juiste datum erbij te halen.

[ Voor 23% gewijzigd door Atmoz op 02-10-2014 17:07 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
atmoz schreef op donderdag 02 oktober 2014 @ 16:36:
Heeft het nut om alles hier neer te zetten wat ik al geprobeerd heb?
Sterker: dat wordt van je verwacht (Quickstart).
atmoz schreef op donderdag 02 oktober 2014 @ 16:36:
en ik durf het ook niet te posten eerlijk gezegd, want er zit echt "sjrot" bij O-)
Dan post je de beste (paar) kanshebber(s) :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

SQL:
1
2
3
4
5
6
7
8
SELECT
    w.AC_NR, Datum, MAX(w.maxv) 
FROM 
    (SELECT 
        AC_NR, Datum, (SELECT MAX(v) FROM (VALUES (V00), (V01), (V02), (V03), (V04)) AS value(v)) AS maxv 
    FROM temp) w 
GROUP BY 
    w.AC_NR


De binnenste SELECT pakt het maximum van de 5 kolommen, vervolgens wordt er een tabel van gemaakt met kolommen AC_NR, Datum, maxv. Daarna met een GROUP BY en MAX(maxv) de boel groeperen per AC_NR en de hoogste pakken.

[ Voor 32% gewijzigd door Rannasha op 02-10-2014 16:54 ]

|| Vierkant voor Wiskunde ||


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je helpt TS vast (heb er niet eens inhoudelijk naar gekeken) met die query maar:
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
Het zou op z'n minst handig zijn als je wat tekst en uitleg bij je code/query doet* (en persoonlijk prefereer ik niet het aanreiken op een zilveren dienblad maar TS in de juiste richting te wijzen).

* Dat heb je inmiddels erbij gezet :P

[ Voor 43% gewijzigd door RobIII op 02-10-2014 16:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 18:53
Ben ik het helemaal mee eens, alleen een "zilveren dienblad" verdient dit naar mijn idee nog niet, als ik de query zo bekijk, dan ontbreekt de voorwaarde voor de datum. Deze moet wel gelijk zijn aan de datum waarop de "MAX waarde" was bereikt.
Het zal vast zo zijn dat de query in deze situatie de juiste terug geeft, maar qua groepering is dat puur geluk.

  • -hopsa-
  • Registratie: Maart 2012
  • Laatst online: 19:32
Aangezien het MSSQL is mag en kun je gelukkig niet op puur geluk vertrouwen

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

Ah, de datum had ik nog even over het hoofd gezien. Daar moet nog iets extra's voor in de query inderdaad.

|| Vierkant voor Wiskunde ||


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
RobIII schreef op donderdag 02 oktober 2014 @ 16:52:
[...]

Sterker: dat wordt van je verwacht (Quickstart).


[...]

Dan post je de beste (paar) kanshebber(s) :?
Done!
De rest van mijn probeersels heeft allemaal te maken om de datum erin te krijgen, en om het AC_NR gedeelte dynamisch te krijgen, maar het slaat gewoon nergens op wat er allemaal in die query's staat 8)7
Rannasha schreef op donderdag 02 oktober 2014 @ 16:52:
SQL:
1
2
3
4
5
6
7
8
SELECT
    w.AC_NR, Datum, MAX(w.maxv) 
FROM 
    (SELECT 
        AC_NR, Datum, (SELECT MAX(v) FROM (VALUES (V00), (V01), (V02), (V03), (V04)) AS value(v)) AS maxv 
    FROM temp) w 
GROUP BY 
    w.AC_NR


De binnenste SELECT pakt het maximum van de 5 kolommen, vervolgens wordt er een tabel van gemaakt met kolommen AC_NR, Datum, maxv. Daarna met een GROUP BY en MAX(maxv) de boel groeperen per AC_NR en de hoogste pakken.
Thanks!!
Dat ziet er inderdaad naar uit (zeker zo met die beschrijving erbij) dat dit wel eens zou kunnen werken. Ik krijg alleen een foutmelding bij "temp"
Invalid object name 'temp'.
RobIII schreef op donderdag 02 oktober 2014 @ 16:52:
persoonlijk prefereer ik niet het aanreiken op een zilveren dienblad maar TS in de juiste richting te wijzen.
Is normaal ook het beste inderdaad :)
Maar betekend dat dat je hier op GoT beter niet terecht kunt als je eens snelle oplossing wilt/zoekt?
Ik doe dit soort dingen (ingewikkelde SQL query's) normaal niet, maar mijn collega is met verlof, en ik zou graag dit probleem willen oplossen.

Ik snap het fish verhaal helemaal, maar als ik dit eerst moet gaan leren/uitzoeken hier, dan is in de tussentijd m'n collega alweer 2 weken aan de slag. Ik hoor graag hoe 't zit, want ik pas me natuurlijk graag aan!

Allemaal sowieso thanks voor 't meedenken/helpen!!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
atmoz schreef op donderdag 02 oktober 2014 @ 17:16:
Maar betekend dat dat je hier op GoT beter niet terecht kunt als je eens snelle oplossing wilt/zoekt?
Als je, met alle respect, gewoon je vraag wil dumpen en de oplossing afhalen na een uurtje dan kun je je heil inderdaad beter zoeken op StackOverflow (of DBA.StackExchange ofzo). GoT is een discussieforum, geen afhaalchinees ;) We zijn op GoT gewoon niet gericht op vraag-en-afhaal maar op elkaar wijzer maken en dat doe je op zo'n manier dus niet :Y)

Zie overigens daarvoor ook Kan iemand even...?

[ Voor 19% gewijzigd door RobIII op 02-10-2014 19:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
RobIII schreef op donderdag 02 oktober 2014 @ 18:13:
[...]

Als je, met alle respect, gewoon je vraag wil dumpen en de oplossing afhalen na een uurtje dan kun je je heil inderdaad beter zoeken op StackOverflow (of DBA.StackExchange ofzo). GoT is een discussieforum, geen afhaalchinees ;) We zijn op GoT gewoon niet gericht op vraag-en-afhaal maar op elkaar wijzer maken en dat doe je op zo'n manier dus niet :Y)

Zie overigens daarvoor ook Kan iemand even...?
Duidelijk!

Thanks :)


Even over de query... ik ben er zojuist aan verder gegaan, en krijg nu resultaat. MAAR: ik krijg veel te veel records terug.

Dit is nu de query:

code:
1
2
3
4
5
6
7
8
SELECT
    w.AC_NR, Datum, MAX(w.maxv) 
FROM 
    (SELECT 
        AC_NR, Datum, (SELECT MAX(v) FROM (VALUES (V00), (V01), (V02), (V03), (V04)) AS value(v)) AS maxv 
    FROM TbTabel) w 
GROUP BY 
    w.AC_NR, w.Datum


De "temp" uit het voorbeeld (en de foutmelding in mijn eerdere post) was dus een tabel 8)7 :X
In de group by heb ik ", w.Datum" erbij moeten zetten, anders werkte de query sowieso niet.

Maar hoe fix ik nu dat hij niet zoveel records terug geeft?
AC_NR komt nu meerdere malen voor in de output, en dat moet dus niet.
Pagina: 1