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.
相关产品推荐
相关产品推荐

