[MSSQL] Alleen hoogste nummer weergeven per product

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DyArt
  • Registratie: Maart 2003
  • Laatst online: 20:50
Ik heb een probleem met mssql waar ik niet uit kom. Ik heb de volgende query:
SQL:
1
2
3
4
SELECT distinct VDSTAM.OMSCHRIJVING1, HISVVI.LEVERDATUM, VDSTAM.TOTHUIDIGEVOORRAAD, (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) AS 'WAARDE', DATEDIFF(day, (convert(datetime, (CAST(HISVVI.LEVERDATUM  AS VARCHAR(8))), 112)) ,getdate()) AS no_of_days
FROM VDSTAM, HISVVI
WHERE HISVVI.ARTIKELCODE = VDSTAM.ARTIKELCODE
ORDER BY (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) DESC

output
omschrijving1leverdatumtothuidigevoorraadwaardeno_of_days
Product A201205011001000"het verschil in dagen"
Product A201206011001000"het verschil in dagen"
Product A201206201001000"het verschil in dagen"
Product B20120610105350"het verschil in dagen"
Product B20120628105350"het verschil in dagen"
Product B20120715105350"het verschil in dagen"


Het betreft dus een tabel met voorraad artikelen en een tabel met historische transacties van de voorraad.
Het verschil in dagen is het verschil tussen vandaag en de laatste leverdatum maar dat werkt op zich wel.
Ik zou als output willen hebben alleen de verschillende regels met de laatste leverdatum dus:


omschrijving1leverdatumtothuidigevoorraadwaardeno_of_days
Product A201206201001000"het verschil in dagen"
Product B20120715105350"het verschil in dagen"


Is er een methode om dit te realiseren?

Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Je wil dus de MAX(leverdatum) selecteren voor alle unieke producten?

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • DyArt
  • Registratie: Maart 2003
  • Laatst online: 20:50
Als ik de max of soortgelijke functies probeer krijg ik een foutmelding onjuiste column expressie op laatste functie van de SELECT.

[ Voor 10% gewijzigd door DyArt op 29-08-2012 15:09 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DyArt schreef op woensdag 29 augustus 2012 @ 15:02:
Als ik de max of soortgelijke functies probeer krijg ik een foutmelding onjuiste column expressie op laatste functie van de SELECT.
Dan doe je iets fout ;) Laat eens zien wat je precies doet?

Verder: lees even héél aandachtig Hoe werkt dat GROUP BY nu eigenlijk?

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


Acties:
  • 0 Henk 'm!

  • Loadichus
  • Registratie: November 2002
  • Laatst online: 01-06-2021
Je hebt een "Group by" nodig

link

[ Voor 71% gewijzigd door Loadichus op 29-08-2012 15:14 . Reden: paar sec te laat ... ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

offtopic:
Loadichus: hoewel hier niets over de SQL-tutorials op die site staat, is dit heel goed leesvoer: http://w3fools.com/. W3Schools wordt gerund door een stel amateurs en kan beter vermeden worden.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DyArt
  • Registratie: Maart 2003
  • Laatst online: 20:50
De group by heb ik ook geprobeerd maar dan moet je ook de HISVVI.LEVERDATUM in een group by zetten en dan werkt het weer niet met de MAX functie

Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Group by gaat goed zolang er in de andere geselecteerde kolommen hetzelfde staat, vermits alle geselecteerde kolomomen, buiten diegene die je max't, in je order by staat.

Gebruik je Oracle, dan kun je window functions gebruiken
select ..., max(column) over (partition by column_name)

Anders zal je met 2 querries moeten gaan werken en die met elkaar joinen.

Als ik iets SQL gerelateerd moet weten, kijk ik meestal eens op Tech on the net

[ Voor 17% gewijzigd door Big Womly op 29-08-2012 15:40 ]

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • DyArt
  • Registratie: Maart 2003
  • Laatst online: 20:50
zo werkt het zonder de berekening voor het verschil in dagen

SQL:
1
2
3
4
5
SELECT DISTINCT VDSTAM.OMSCHRIJVING1, Max(HISVVI.LEVERDATUM) AS AFLEVERDATUM, VDSTAM.TOTHUIDIGEVOORRAAD, (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) AS 'WAARDE'
FROM HISVVI, VDSTAM
WHERE (VDSTAM.TOTHUIDIGEVOORRAAD>0) AND (VDSTAM.VERREKENPRIJS>0) AND (VDSTAM.DATUMLAATSTEINKOOP>0) AND (HISVVI.ARTIKELCODE=VDSTAM.ARTIKELCODE) AND (HISVVI.LEVERDATUM>0)
GROUP BY VDSTAM.OMSCHRIJVING1, VDSTAM.TOTHUIDIGEVOORRAAD, VDSTAM.TOTGERESERVEERD, VDSTAM.VERREKENPRIJS
ORDER BY (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) DESC


en zo krijg ik weer alle waarden uit de historie te zien

SQL:
1
2
3
4
5
SELECT DISTINCT VDSTAM.OMSCHRIJVING1, Max(HISVVI.LEVERDATUM) AS AFLEVERDATUM, VDSTAM.TOTHUIDIGEVOORRAAD, (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) AS 'WAARDE', DATEDIFF(day, (convert(datetime, (CAST(HISVVI.LEVERDATUM  AS VARCHAR(8))), 112)) ,getdate()) AS no_of_days
FROM HISVVI, VDSTAM
WHERE (VDSTAM.TOTHUIDIGEVOORRAAD>0) AND (VDSTAM.VERREKENPRIJS>0) AND (VDSTAM.DATUMLAATSTEINKOOP>0) AND (HISVVI.ARTIKELCODE=VDSTAM.ARTIKELCODE) AND (HISVVI.LEVERDATUM>0)
GROUP BY VDSTAM.OMSCHRIJVING1, VDSTAM.TOTHUIDIGEVOORRAAD, VDSTAM.TOTGERESERVEERD, VDSTAM.VERREKENPRIJS, HISVVI.LEVERDATUM
ORDER BY (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) DESC


Kan het dan niet in een query inclusief berekening van de dagen die zijn verstreken?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom staat dat aantal dagen überhaupt in een veld in plaats van het te berekenen aan de clientkant? Heb je daar een goede reden voor? Als je die berekening naar de client trekt kun je hier makkelijker met group by werken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DyArt
  • Registratie: Maart 2003
  • Laatst online: 20:50
Ik wil eigenlijk geen berekeningen aan de client kant. De client moet gewoon data ontvangen en deze direct kunnen toepassen. Bovenstaande query is dan ook maar een gedeelte van de complet query want hij bestaat ook nog uit een aantal case when velden voor ondermeer een ouderdomsoverzicht te genereren.

Acties:
  • 0 Henk 'm!

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 16-09 16:46
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
VDSTAM.OMSCHRIJVING1
, HIS.LEVERDATUM
, VDSTAM.TOTHUIDIGEVOORRAAD
, (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) AS 'WAARDE'
, DATEDIFF(day, (convert(datetime, (CAST(HIS.LEVERDATUM  AS VARCHAR(8))), 112)) ,getdate()) AS no_of_days
FROM VDSTAM
INNER JOIN (SELECT ARTIKELCODE,MAX(LEVERDATUM) AS LEVERDATUM FROM HISVVI GROUP BY ARTIKELCODE) HIS 
  ON VDSTAM.ARTIKELCODE = HIS.ARTIKELCODE
ORDER BY (VDSTAM.TOTHUIDIGEVOORRAAD*VDSTAM.VERREKENPRIJS) DESC


Uit het hoofd een basisopzetje gemaakt. Denk zelf even na over wat je wilt doen met producten die nooit eerder geleverd zijn.
Pagina: 1