2017-10-18 42 views
0

La requête ci-dessous extrait les données ci-dessous.Sélection du résultat supérieur de chaque catégorie de produit

enter image description here

J'essaie de ne retourner un résultat unique pour chaque numéro de produit, avec seulement la plus haute orddate, et total de la commande connexe (ordttl) et le coût unitaire (ucost).

Des idées sur la mise en œuvre? Merci pour vos réponses

SELECT 
ordln.pnum as 'Product Number', 
prod.name as 'Product Name', 
ordhd.snum, 
sup.name, 
ordhd.ordttl, 
ORDHD.onum, 
ORDHD.orddate, 
ordln.ucost 
FROM 
scmdb.dbo.cksprodm prod (NOLOCK) 
INNER JOIN scmdb.dbo.cksordln ordln (NOLOCK) on prod.pnum = ordln.pnum 
INNER JOIN scmdb.dbo.cksordhd ordhd (NOLOCK) on ordhd.onum = ordln.onum 
LEFT JOIN scmdb.dbo.ckssuplr sup (NOLOCK) on ordhd.snum = coalesce(sup.snum, 
sup.asnum) 
WHERE ordhd.orddate BETWEEN 
DATEADD(month,-6,dateadd(day,datediff(day,0,getdate()),0) + '06:00') AND 
GETDATE() -- order date is between 6 months ago and today. 
AND ordln.pnum NOT IN (SELECT distinct PNUM 
        FROM scmdb.dbo.cksquohd qhd 
        inner join scmdb.dbo.cksquoln qln on qhd.quote = qln.quote 
        where qhd.qedate > GETDATE() 
       ) 
+0

soit utiliser ou rejoindre sur row_number cross appliquer sur le dessus 1 – maSTAShuFu

+0

Peut-il être des liens? Si oui, comment devraient-ils être traités? – HABO

+0

@HABO Il est hautement improbable que cela se produise puisque l'orddate inclut aussi du temps. Si cela se produisait, sélectionner arbitrairement l'un des résultats serait acceptable. –

Répondre

3

Vous pouvez utiliser row_number pour classer par date et obtenir la dernière ligne de la Date:

SELECT * 
FROM 
(
    SELECT 
    ordln.pnum as 'Product Number', 
    prod.name as 'Product Name', 
    ordhd.snum, 
    sup.name, 
    ordhd.ordttl, 
    ORDHD.onum, 
    ORDHD.orddate, 
    ordln.ucost, 
    row_number() over (partition by ordln.pnum order by ORDHD.orddate desc) as ranking 
    FROM 
    scmdb.dbo.cksprodm prod (NOLOCK) 
    INNER JOIN scmdb.dbo.cksordln ordln (NOLOCK) on prod.pnum = ordln.pnum 
    INNER JOIN scmdb.dbo.cksordhd ordhd (NOLOCK) on ordhd.onum = ordln.onum 
    LEFT JOIN scmdb.dbo.ckssuplr sup (NOLOCK) on ordhd.snum = coalesce(sup.snum, 
    sup.asnum) 
    WHERE ordhd.orddate BETWEEN 
    DATEADD(month,-6,dateadd(day,datediff(day,0,getdate()),0) + '06:00') AND 
    GETDATE() -- order date is between 6 months ago and today. 
    AND ordln.pnum NOT IN (SELECT distinct PNUM 
         FROM scmdb.dbo.cksquohd qhd 
         inner join scmdb.dbo.cksquoln qln on qhd.quote = qln.quote 
         where qhd.qedate > GETDATE() 
        ) 
) t 
where ranking = 1 
+0

Solution très simple. Je vous remercie. –