1
votes

Concaténer deux colonnes dans la requête SELECT et obtenir MAX

J'ai une table avec BUKRS, GJAHR, MONAT et je veux sélectionner le MAX GJAHR & MONAT comme suit:

BUKRS  GJAHR  MONAT
5555   2019   09   
5555   2019   10  
5555   2019   11  
5555   2020   02  

Donc, dans le tableau, nous avons:

SELECT MAX( concat( gjahr, monat ) ) AS year_monat
      FROM zfiou_percentage
        INTO data(lv_year_month)
      WHERE bukrs = '5555' AND
            concat( gjahr, monat ) <= '202001'
      GROUP BY year_monat.

Comment puis-je obtenir la ligne 5555 2019 11 ?


5 commentaires

Qu'est-ce que vous obtenez actuellement avec votre code?


Malheureusement, ce MAX (concat (gjahr, monat)) ne fonctionne pas.


Quelle version ABAP utilisez-vous?


ABAP 7.52 SP02 sur HANA.


Comment exactement "ne fonctionne-t-il pas"? Le programme ne se compile-t-il pas, y a-t-il un message d'erreur ou la sortie ne correspond-elle pas à ce que vous attendez?


3 Réponses :


2
votes

La concaténation des deux colonnes comme vous le prévoyez n'est possible qu'à partir de la version 7.50, comme indiqué par la documentation . Quelle est votre version?

Si vous ne pouvez pas le faire fonctionner ou si vous ne disposez pas de la version ABAP requise, vous pouvez effectuer les opérations suivantes. Pour plus d'informations, consultez sous-requêtes .

DATA: p_bukrs   TYPE bukrs,
      lt_result TYPE TABLE OF zfiou_percentage.

SELECT *
  FROM zfiou_percentage
  INTO CORRESPONDING FIELDS OF TABLE lt_result
 WHERE bukrs = p_bukrs 
   AND gjahr >= ALL ( SELECT gjahr
                        FROM zfiou_percentage 
                       WHERE bukrs = p_bukrs )
   AND monat >= ALL ( SELECT monat
                        FROM zfiou_percentage 
                       WHERE bukrs = p_bukrs 
                         AND gjahr >= ALL ( SELECT gjahr
                                              FROM zfiou_percentage 
                                             WHERE bukrs = p_bukrs ) ).

  • sélectionnez tous les ensembles de données
  • de la table z
  • dans l'itab (car il peut y avoir plusieurs lignes avec les mêmes gjahr et mois maximum)
  • où:
    1. conditions normales (assurez-vous de les utiliser également dans chaque sous-requête)
    2. ET l'année est la plus élevée de toutes les années existant dans la table z
    3. ET le mois est le plus élevé de tous les mois des ensembles de données avec les années les plus élevées

Modifier : (Bien sûr, vous pouvez également sélectionner vos données en plusieurs étapes, en utilisant SELECT et SELECT ... FOR TOUTES LES ENTRÉES ... , ou SELECT et LOOP . Vous devrez réfléchir et tester quelle solution sera la plus efficace, la plus simple à comprendre et la plus adaptée pour votre problème.)


3 commentaires

Incluez éventuellement la condition <= 202001: AND (gjahr <'2020' OR gjahr = '2020' AND monat <= '01') . NB: il est possible de tester la requête ci-dessus en R / 3 ou S / 4 en remplaçant ZFIOU_PERCENTAGE par BKPF .


La question est de savoir comment faire quand gjahr = 2019 et monat = 06. Ici, le résultat est 2019 & 02.


Wow! Très beau mais trop compliqué, la concaténation dans itab le sélectionnera deux fois plus rapide.



0
votes
SELECT
    gjahr AS year,
    monat AS month
  FROM zfiou_percentage
    INTO TABLE DATA(selected_maxes)
  WHERE bukrs = '5555'
    AND ( gjahr < '2020'
      OR gjahr = '2020' AND monat <= '01' )
  ORDER BY
    gjahr DESC,
    monat DESC
  UP TO 1 ROWS.

DATA(selected_max) = selected_maxes[ 1 ].
DATA(max_date) = |{ selected_max-year }{ selected_max-month }|.

3 commentaires

Ce n'est pas correct car il recherche en 2019 monat <= 1, à savoir subrc = 4. J'ai oublié: ORDER BY ne fonctionne pas.


Vous ne pouvez pas utiliser ORDER BY et SELECT SINGLE dans la même instruction


Ha! Pouvez-vous croire que je n'ai jamais remarqué ça? :-) JUSQU'À 1 RANGÉES devrait cependant produire à peu près la même chose.



4
votes

Les colonnes de l'année et du mois ( GJAHR et MONAT ) sont des colonnes numériques text (caractères de 0 à 9), mais MAX n'accepte qu'une colonne numérique (pas de texte), vous pouvez donc utiliser CAST pour convertir ces "textes" en nombres comme suit:

SELECT MAX( CAST( gjahr AS DEC ) * 100 + CAST( monat AS DEC ) ) AS year_monat
      FROM bkpf
      WHERE bukrs = '3001' AND
            concat( gjahr, monat ) <= '202001'
        INTO @DATA(lv_year_month).

Il a été testé dans un système ABAP 7.52 SP 1.

NB: la fonction CAST n'accepte le type DEC que depuis ABAP 7.50. J'utilise la table BKPF au lieu de zfiou_percentage car elle existe dans tous les systèmes R / 3, ECC, S / 4.


4 commentaires

Merci Sandra. La meilleure solution.


Pourquoi multipliez-vous exactement l'année par 100?


@Sasku par 100 car Open SQL attend un nombre pour MAX , donc le mois juin (06) de l'année 2020 serait transformé comme to_number ('2020') * 100 + to_number ('06 ') = 202006, alors MAX peut fonctionner.


Ah ok. Merci pour l'explication.