GROUP BY将AS/400日期格式转换为SQL日期

GROUP BY将AS/400日期格式转换为SQL日期

问题描述:

最终,我想在AS/400(绿色屏幕)中将SQL数据按月份分组。GROUP BY将AS/400日期格式转换为SQL日期

这里是最初的SQL查询及其相应的结果:

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

我想利用这些数据和总结它像这样:

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 

这是我用来转换日期格式:

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' 

结果如下:

Converted Dates

我试图用GROUP BY以相同的转化次数:

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))) 

但得到这个错误信息:

Column ITNBRV or expression in SELECT list not valid. 

谢谢!

不熟悉AS/400 SQL,但看起来您需要按INTBRV进行分组并为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为我,所以你有它正确的位置(AS/400 SQL)遵循SQL标准。这将是ISO/IEC 9075标准,第1-4,10,11和14部分.v7.2和v7.3支持2016标准,v7.1支持以前的标准。 – jmarkmurphy

+0

@jmarkmurphy:有些东西仍然关闭,现在我收到错误消息“列ODDTRV或SELECT列表中的表达式无效。” – Sescopeland

+1

认为你还需要组中的(年(...))表达式... – Charles

个人而言,我更喜欢用公用表表达式(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