2017-10-20 47 views
0

Finalement, je veux prendre quelques données et les regrouper par mois dans SQL dans l'AS/400 (Green Screen).GROUP BY Format de date AS/400 converti en date SQL

Voici la requête SQL initiale et le résultat correspondant:

SELECT ITNBRV, /* Item */ 
     ODDTRV, OQTYRV /* Order due due, Order quantity */ 
    FROM ORDREVLA /* MRP Recommendations */ 
WHERE ITNBRV = '17000' OR ITNBRV = '19000' /* Returns only items 17000, 19000 */ 

Query Result Screen Shot

Je voudrais prendre ces données et résumer comme ceci:

Item number Order Due Date Order Quantity 
    17000   11/17   1296 
    17000   12/17   1296 
    17000   01/18   3564 
    17000   02/18   3888 
    19000   11/17   68100 
    19000   12/17   1800 
    19000   01/18   23220 

Voici ce que j'ai utilisé pour convertir le format de la date:

SELECT ITNBRV, 
     month(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) ||'/'|| 
     year(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) AS Month_Year, 
     OQTYRV 
    FROM ORDREVLA 
    WHERE ITNBRV = '17000' OR ITNBRV = '19000' 

Avec le résultat suivant:

Converted Dates

J'ai essayé d'utiliser GROUP BY avec les mêmes numéros de conversion:

SELECT ITNBRV, 
     month(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) ||'/'|| 
     year(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) AS Month_Year, 
     OQTYRV 
    FROM ORDREVLA 
    WHERE ITNBRV = '17000' OR ITNBRV = '19000' 
GROUP BY (month(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2))) 

mais nous avons eu ce message d'erreur:

Column ITNBRV or expression in SELECT list not valid. 

Merci!

Répondre

2

Vous ne connaissez pas AS/400 SQL, mais il semble que vous ayez besoin de grouper par INTBRV et d'ajouter une agrégation à ORDREVLA.

SELECT 
     ITNBRV, 
     month(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) ||'/'|| 
     year(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) AS Month_Year, 
     SUM(OQTYRV) as OQTYRV_Total 
FROM 
     ORDREVLA 
WHERE 
     ITNBRV = '17000' OR ITNBRV = '19000' 
GROUP BY (month(
      substr(ODDTRV,4,2) ||'/'|| 
      substr(ODDTRV,6,2) ||'/'|| 
      substr(ODDTRV,2,2))), 
      ITNBRV 
+0

DB2 for i (AS/400 SQL) suit la norme SQL afin que vous l'avez correctement ici. Ce serait les normes ISO/CEI 9075, parties 1-4, 10, 11, et 14. v7.2 et v7.3 support des normes 2016, v7.1 prend en charge les normes précédentes. – jmarkmurphy

+0

@jmarkmurphy: Quelque chose est toujours éteint, maintenant je reçois le message d'erreur "Colonne ODDTRV ou expression dans la liste SELECT non valide." – Sescopeland

+1

Pensez que vous avez besoin de l'expression (année (...)) dans le groupe par ... – Charles

0

personnellement, je préfère gérer cela avec une expression de table commune (CTE) ..

with mmyy as (
SELECT 
     ITNBRV, 
     month(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) ||'/'|| 
     year(
     substr(ODDTRV,4,2) ||'/'|| 
     substr(ODDTRV,6,2) ||'/'|| 
     substr(ODDTRV,2,2)) AS Month_Year, 
     OQTYRV 
FROM 
     ORDREVLA 
WHERE 
     ITNBRV = '17000' OR ITNBRV = '19000' 
) 
select 
    itnbrv, month_year, sum(oqtyrv) as OQTYRV_Total 
from 
    mmyy 
group by 
    itnbrv, month_year