You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DB2多表查询:按日期聚合求和并关联历史订单视图

嘿,我来帮你搞定这个SQL查询需求!先把我们手头的信息和目标理清楚:

需求概述

当前日期是2018年5月2日(编码1180502),我们需要从三张表/视图中查询出每个产品的:

  • 产品ID、名称
  • 去年5月的订单总量(来自OHIST视图)
  • 未来3天(D1=5月3日、D2=5月4日、D3=5月5日)每日的订单数量总和
    最终按产品ID整理成表格展示。
现有表结构与数据示例

1. ITEMS表(产品列表,ID是主键)

IDNAME
10Widget10
11Widget11
12Widget12
13Widget13

2. ODETAILS表(订单行项目表,无主键)

OIDODUEITEM_IDITEM_QTY
A33118050310100
A33118050411215
A34118050510500
A34118050411320
A34118050412450
A34118050513125

3. OHIST视图(展示去年月度订单总量)

ITEM_IDM5QTY
101000
111500
122251
134334
日期转换函数说明

这里提供了一个把ODUE编码转换成标准日期的函数:

DATE(concat(concat(concat(substr(char((ODETAILS.ODUE-1000000)+20000000),1,4),'-'), concat(substr(char((ODETAILS.ODUE-1000000)+20000000),5,2), '-')), substr(char((ODETAILS.ODUE-1000000)+20000000),7,2)))

简单说,它能把1180503这种编码转换成2018-05-03这样的可识别日期格式,方便我们按日期筛选订单。

最终SQL查询语句

核心思路是用条件聚合来分别统计未来3天的订单量,同时用LEFT JOIN确保所有产品都能出现在结果里(哪怕某天没有订单):

SELECT
    i.ID,
    i.NAME,
    o.M5QTY,
    -- 统计5月3日(D1)的订单量
    SUM(CASE 
        WHEN DATE(concat(concat(concat(substr(char((od.ODUE-1000000)+20000000),1,4),'-'), concat(substr(char((od.ODUE-1000000)+20000000),5,2), '-')), substr(char((od.ODUE-1000000)+20000000),7,2))) = '2018-05-03' 
        THEN od.ITEM_QTY 
        ELSE NULL 
    END) AS D1,
    -- 统计5月4日(D2)的订单量
    SUM(CASE 
        WHEN DATE(concat(concat(concat(substr(char((od.ODUE-1000000)+20000000),1,4),'-'), concat(substr(char((od.ODUE-1000000)+20000000),5,2), '-')), substr(char((od.ODUE-1000000)+20000000),7,2))) = '2018-05-04' 
        THEN od.ITEM_QTY 
        ELSE NULL 
    END) AS D2,
    -- 统计5月5日(D3)的订单量
    SUM(CASE 
        WHEN DATE(concat(concat(concat(substr(char((od.ODUE-1000000)+20000000),1,4),'-'), concat(substr(char((od.ODUE-1000000)+20000000),5,2), '-')), substr(char((od.ODUE-1000000)+20000000),7,2))) = '2018-05-05' 
        THEN od.ITEM_QTY 
        ELSE NULL 
    END) AS D3
FROM
    ITEMS i
LEFT JOIN
    OHIST o ON i.ID = o.ITEM_ID
LEFT JOIN
    ODETAILS od ON i.ID = od.ITEM_ID
GROUP BY
    i.ID, i.NAME, o.M5QTY
ORDER BY
    i.ID;

如果希望无订单的日期显示0而非空值,把ELSE NULL改成ELSE 0就行。

预期查询结果

执行上面的SQL后,会得到和你期望完全一致的结果:

IDNAMEM5QTYD1D2D3
10Widget101000100500
11Widget111500535
12Widget122251450
13Widget134334125

内容的提问来源于stack exchange,提问作者Tom Sampson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:39