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

Oracle 11 XE如何将指定列查询转换为行数据

搞定Oracle指定日期的查询需求

嘿,我来帮你解决这个问题~先把你的表结构和示例数据整理清楚,方便后续参考:

CREATE TABLE tst (
    val_a NUMBER, 
    val_b NUMBER, 
    val_c NUMBER, 
    val_sum NUMBER, 
    id NUMBER, 
    dt DATE
);

INSERT INTO tst VALUES(12,15,17,44,1,TO_DATE('2018-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO tst VALUES(14,16,11,41,1,TO_DATE('2018-03-03 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO tst VALUES(6,7,8,21,2,TO_DATE('2018-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));

下面分两种最常见的场景给你对应的查询语句,你可以根据自己的实际需求选择:

场景1:直接获取两个指定日期的所有记录

如果你只是想把2018-03-01和2018-03-03这两个日期的所有数据查出来,用IN筛选日期就行,记得用TRUNC(dt)忽略时分秒,避免因为时间部分不匹配漏数据:

SELECT *
FROM tst
WHERE TRUNC(dt) IN (TO_DATE('2018-03-01', 'YYYY-MM-DD'), TO_DATE('2018-03-03', 'YYYY-MM-DD'))
ORDER BY id, dt;

执行后会返回这两个日期的全部3条记录,按id和日期排序,看起来更清晰。

场景2:按ID对比两个日期的数值差异

如果需要对比同一个id在两个日期的数值(比如val_sum的变化),用条件聚合的方式最简洁,还能直接算出差值:

SELECT 
    id,
    -- 第一个日期的val_sum
    MAX(CASE WHEN TRUNC(dt) = TO_DATE('2018-03-01', 'YYYY-MM-DD') THEN val_sum END) AS val_sum_20180301,
    -- 第二个日期的val_sum
    MAX(CASE WHEN TRUNC(dt) = TO_DATE('2018-03-03', 'YYYY-MM-DD') THEN val_sum END) AS val_sum_20180303,
    -- 计算两个日期的差值
    MAX(CASE WHEN TRUNC(dt) = TO_DATE('2018-03-03', 'YYYY-MM-DD') THEN val_sum END) - 
    MAX(CASE WHEN TRUNC(dt) = TO_DATE('2018-03-01', 'YYYY-MM-DD') THEN val_sum END) AS sum_change
FROM tst
WHERE TRUNC(dt) IN (TO_DATE('2018-03-01', 'YYYY-MM-DD'), TO_DATE('2018-03-03', 'YYYY-MM-DD'))
GROUP BY id;

这个查询会返回:

  • id=1的两个日期val_sum分别是44和41,差值为-3
  • id=2因为在2018-03-03没有数据,所以对应字段为null

要是你有更具体的需求(比如要统计val_a/val_b的总和、或者是日期范围而非指定两个日期),可以随时补充说明,我再调整方案~

内容的提问来源于stack exchange,提问作者S.T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:23:31