SAP B1 Service Layer中YEAR/MONTH函数的SQL查询问题求助
解决方案:SAP B1 Service Layer按设备、年月分组统计成本
方案1:直接在HANA SQL中提取年月(最简便)
Service Layer本身不支持YEAR()/MONTH()函数,但提交的SQL会直接在HANA数据库执行,可利用HANA原生日期处理函数完成分组,无需依赖OData的$apply。
修正后的SQL查询(补全表别名、用TO_CHAR提取年月):
SELECT t10."OcrCode4" as "Equipo", TO_CHAR(t0."DocDate", 'YYYY') as "Anio", TO_CHAR(t0."DocDate", 'MM') as "Mes", SUM(t0."DocTotal") as "Total" FROM OPCH t0 INNER JOIN PCH1 t10 ON t0."DocEntry" = t10."DocEntry" WHERE t0."CANCELED" = 'N' AND t10."OcrCode4" > 'A0000000' GROUP BY t10."OcrCode4", TO_CHAR(t0."DocDate", 'YYYY'), TO_CHAR(t0."DocDate", 'MM') ORDER BY t10."OcrCode4", "Anio", "Mes"
将此SQL通过POST /b1s/v1/SQLQueries创建查询后,直接调用/SQLQueries('sqlXX')/List即可获取已分组统计的结果,无需额外处理。
方案2:利用OData日期属性完成$apply分组
OData规范中,日期类型字段自带Year、Month等属性,无需函数调用。先修正SQLQuery(解决原SQL中GROUP BY与SELECT字段不匹配的问题):
POST https://**:50003/b1s/v1/SQLQueries { "SqlCode": "sql21", "SqlName": "QueryOnItem21", "SqlText": "SELECT t10.OcrCode4 as equipo, t0.DocDate as fecha, t0.DocTotal as total FROM OPCH t0 INNER JOIN PCH1 t10 ON t0.DocEntry = t10.DocEntry WHERE t0.CANCELED = 'N' AND t10.OcrCode4 > 'A0000000'" }
再使用OData属性路径进行分组:
https://**:50003/b1s/v1/SQLQueries('sql21')/List?$apply=groupby((equipo, fecha/Year, fecha/Month), aggregate(total with sum as TotalSales))
方案3:在Power BI/Excel中直接处理分组
若不想修改Service Layer查询,可直接拉取原始数据(设备、日期、金额)到前端工具完成分组:
- Power BI:添加计算列,用
YEAR([fecha])和MONTH([fecha])提取年月,再通过可视化或分组功能统计总额。 - Excel:使用数据透视表,将设备、年份、月份拖入行区域,金额拖入值区域并设置为求和。
内容的提问来源于stack exchange,提问作者DeSyDo
相关产品推荐
相关产品推荐

