2017-07-20 4 views
1

Quelque chose s'est mal passé et je me rends compte que je ne comprends pas ce que je veux. J'ai les lignes suivantes dans une table:Comment obtenir la date maximale par mois en utilisant SQL

0000527746 1000 10.06.2017 20170718100757.5010080 
0000527746 1000 10.06.2017 20170718100757.5039300 
0000527746 1000 11.06.2017 20170718100839.9209480 
0000527746 1000 11.06.2017 20170718100906.3337170 
0000527746 1000 24.07.2017 20170718095843.3555610 
0000527746 1000 24.07.2017 20170718100209.2203570 
0000527746 1000 24.07.2017 20170718100757.4970390 

et je veux choisir la dernière date de chaque mois à savoir que je veux la sélection pour me mettre les lignes suivantes

0000527746 1000 11.06.2017 20170718100906.3337170 
0000527746 1000 24.07.2017 20170718100757.4970390 

J'utilise l'instruction SQL suivante

select bukrs kunnr dat max(time) as time 
    from zcollectoraction into corresponding fields of table it_collectoraction 
    where bukrs = p_bukrs and 
      kunnr in so_kunnr and 
      dat in so_date 
    group by bukrs kunnr dat. 

mais il affiche les lignes suivantes

0000527746 1000 11.06.2017 20170718100906.3337170 
0000527746 1000 11.06.2017 20170718100906.3337170 
0000527746 1000 24.07.2017 20170718100757.4970390 

Que faire pour avoir 1 ligne par mois?

+0

À quoi font référence 'bukrs' et' kunnr'? Je présume les deux premières colonnes? –

Répondre

-1

Ce que vous avez besoin est de group by pas dat, mais par mois et l'année - cette clause fonctionnera:

GROUP BY bukrs, kunnr, MONTH(dat), YEAR(dat) 
+0

Vous ne pouvez pas l'utiliser dans les instructions OpenSQL d'abap. – Oguz

-1

Bonjour et merci pour vos réponses. J'ai résolu le problème en faisant 2 sélections. Au 1er je reçois le dernier jour ou les jours du mois avec la sélection suivante

select bukrs kunnr yearmonth max(dat) as dat 
    from zcollectoraction into corresponding fields of table it_collectoraction 
    where bukrs = p_bukrs and 
      kunnr in so_kunnr and 
      dat in so_date 
    group by bukrs kunnr yearmonth. 

puis je fait une boucle à la table interne pour remplir les données restantes et sélectionnez l'heure MAX pour tous les enregistrements et surtout quand il y a plus de 1 lignes par bukrs, kunnr et date.

select single * from zcollectoraction 
         into corresponding fields of wa_collectoraction 
    where bukrs = wa_collectoraction-bukrs and 
     kunnr = wa_collectoraction-kunnr and 
     dat = wa_collectoraction-dat and 
     time = (select max(time) as time 
        from zcollectoraction 
        where bukrs = wa_collectoraction-bukrs and 
          kunnr = wa_collectoraction-kunnr and 
          dat = wa_collectoraction-dat). 

Encore une fois merci Elias

+0

CHOISIR LES SINGLES dans une boucle sont horribles pour la performance. –

+0

Andras quelle est votre proposition? – ekekakos

+0

OpenSQL ne contient pas de fonction MONTH. Vous devez soit utiliser SQL natif, soit sélectionner toutes les lignes possibles en même temps et trouver le maximum mensuel sur le côté ABAP –

0

Je pense qu'il ya deux solutions pour cette question. 1) Vous pouvez ajouter le champ yearmonth à votre table db. Et ajoutez ce champ à grouper par instruction.

0000527746 1000 10.06.2017 20170718100757.5010080 201706 
0000527746 1000 10.06.2017 20170718100757.5039300 201706 
0000527746 1000 11.06.2017 20170718100839.9209480 201706 
0000527746 1000 11.06.2017 20170718100906.3337170 201706 
0000527746 1000 24.07.2017 20170718095843.3555610 201707 
0000527746 1000 24.07.2017 20170718100209.2203570 201707 
0000527746 1000 24.07.2017 20170718100757.4970390 201707 

select bukrs kunnr dat max(time) as time 
    from zcollectoraction into corresponding fields of table 
    it_collectoraction 
    where bukrs = p_bukrs and 
      kunnr in so_kunnr and 
      dat in so_date 
    group by bukrs kunnr dat yearmonth. 

2) Vous pouvez sélectionner toutes les données et organiser les instructions dans la boucle. Ou vous pouvez utiliser votre ancienne requête de sélection n'a pas d'importance du tout.

select bukrs kunnr dat time 
    from zcollectoraction into corresponding fields of table 
    it_collectoraction 
    where bukrs = p_bukrs and 
      kunnr in so_kunnr and 
      dat in so_date . 

loop at it_collectoraction into data(ls_coll). 
    delete it_collectoraction[] WHERE dat(6) = ls_coll-dat(6) 
           and dat < = ls_coll-dat 
           and time < ls_coll-time. 
endloop.