2012-07-16 4 views
1

Je veux lister les derniers paiements de mes clients par ordre décroissant.Groupe par client et date maximale

j'ai écrit une requête SQL

SELECT CARHARTAR, 
     CARHARREFNO, 
     CARHARCARKOD, 
     CARHARCARUNVAN, 
     CARHARACIKLAMA, 
     CARHARTUTAR 
FROM CARHAR 
WHERE (CARHARTIPI IN (2, 4)) 
     AND (CARHARISTIPNO IN (2, 6)) 
     AND (CARHARCARKOD NOT LIKE 'W%') 
     AND (CARHARCARKOD NOT LIKE 'Z%') 
     AND (CARHARGCFLAG = 2) 
     AND (CARHARIADEFLAG = 0) 
ORDER BY CARHARTAR DESC 

Cette liste de requêtes tout d'ordre de paiement par date décroissante. Mais j'ai seulement besoin du dernier paiement. J'utilise le groupe par carharcarkod mais j'ai un problème de fonction d'aggreate. Que devrais-je faire ?

Here is a screenshot of query result

+1

Qu'est-ce que SGBDR utilisez-vous? –

+0

J'utilise MSSQL –

+0

Quelle version de Sql Server utilisez-vous? Quelles colonnes constituent la clé primaire? –

Répondre

1

Je pense que la fonction ROW_NUMBER ferait ce que vous recherchez:

;WITH Payments AS 
( SELECT CARHARTAR, 
      CARHARREFNO, 
      CARHARCARKOD, 
      CARHARCARUNVAN, 
      CARHARACIKLAMA, 
      CARHARTUTAR, 
      ROW_NUMBER() OVER(PARTITION BY CARHARCARKOD ORDER BY CARHARTAR DESC) [RowNumber] 
    FROM CARHAR 
    WHERE CARHARTIPI IN (2, 4) 
    AND  CARHARISTIPNO IN (2, 6) 
    AND  CARHARCARKOD NOT LIKE 'W%' 
    AND  CARHARCARKOD NOT LIKE 'Z%' 
    AND  CARHARGCFLAG = 2 
    AND  CARHARIADEFLAG = 0 
) 
SELECT CARHARTAR, 
     CARHARREFNO, 
     CARHARCARKOD, 
     CARHARCARUNVAN, 
     CARHARACIKLAMA, 
     CARHARTUTAR 
FROM Payments 
WHERE RowNumber = 1 
ORDER BY CARHARTAR 
+0

je vous remercie de cette oeuvre! –

0

si vous utilisez groupe par l'article, vous devez inclure tous les champs dans le groupe par lequel vous voulez sélectionner.

SELECT CARHARTAR, 
    CARHARCARKOD FROM CARHAR WHERE (CARHARTIPI IN (2, 4)) 
    AND (CARHARISTIPNO IN (2, 6)) 
    AND (CARHARCARKOD NOT LIKE 'W%') 
    AND (CARHARCARKOD NOT LIKE 'Z%') 
    AND (CARHARGCFLAG = 2) 
    AND (CARHARIADEFLAG = 0) GROUP BY CARHARTAR,carharcarkod DESC 
+0

je connais le groupe par l'utilisation. Mais j'ai besoin tous les champs (CARHARTAR, CARHARREFNO, CARHARCARKOD, CARHARCARUNVAN, CARHARACIKLAMA, CARHARTUTAR) et je ne sais pas ce que dois-je faire –

0
with cte as(
SELECT CARHARCARKOD,max(CARHARTAR) [CARHARTAR] 
FROM CARHAR 
WHERE (CARHARTIPI IN (2, 4)) 
     AND (CARHARISTIPNO IN (2, 6)) 
     AND (CARHARCARKOD NOT LIKE 'W%') 
     AND (CARHARCARKOD NOT LIKE 'Z%') 
     AND (CARHARGCFLAG = 2) 
     AND (CARHARIADEFLAG = 0) 
group by CARHARCARKOD ) 
select C.CARHARTAR, 
     C.CARHARREFNO, 
     C.CARHARCARKOD, 
     C.CARHARCARUNVAN, 
     C.CARHARACIKLAMA, 
     C.CARHARTUTAR 
FROM cte join CARHAR C 
on CTE.CARHARCARKOD =C.CARHARCARKOD  
and cte.CARHARTAR= C.CARHARTAR 
+0

merci pour aider. Mais le résultat de la requête n'est pas correct. Vous pouvez voir ici: http://www.flickr.com/photos/cihankusmez/7582490650/ –

+0

J'ai besoin seulement des derniers paiements des clients –

Questions connexes