【问题标题】:sql db2 select records from either tablesql db2 从任一表中选择记录
【发布时间】:2012-04-06 18:26:05
【问题描述】:

我有一个订单文件,其中包含订单 ID 和发货日期。订单只能在周一至周五发货。这意味着没有选择周六和周日的记录。

我使用同一个订单文件来获取所有订单日期,日期格式相同 (yyyymmdd)。

我想根据订单日期从订单文件中选择所有记录的计数......和(我相信)完全外部连接(或者可能是正确连接?)日期文件......因为我想见

20120330 293

20120331 0

20120401 0

20120402 920

20120403 430

20120404 827

等等……

但是,我的 sql 语句仍然没有返回第 31 和第 1 的零记录。

with DatesTable as (
   select ohordt "Date" from kivalib.orhdrpf
   where ohordt between 20120315 and 20120406
   group by ohordt order by ohordt
)

SELECT ohscdt, count(OHTXN#) "Count"

FROM KIVALIB.ORHDRPF full outer join DatesTable dts on dts."Date" = ohordt
--/*order status = filled & order type = 1 & date between (some fill date range)*/

WHERE OHSTAT = 'F' AND OHTYP = 1 and ohscdt between 20120401 and 20120406

GROUP BY ohscdt ORDER BY ohscdt

任何想法我做错了什么?

谢谢!

【问题讨论】:

  • 我建议不要即时构建DatesTable,而是构建一个日历文件,其中包含每个日期(在某个范围内)。另外,最好使用内置的日期/时间/时间戳数据类型,而不是一些格式化的数字/字符串

标签: sql join db2


【解决方案1】:

这是因为那些日子没有数据,它们不会显示为行。您可以使用递归 CTE 在查询可以连接的两个值之间构建一个连续的日期列表:

它看起来像:

WITH dates (val) AS (
    SELECT CAST('2012-04-01' AS DATE)
    FROM SYSIBM.SYSDUMMY1
        UNION ALL
    SELECT Val + 1 DAYS
    FROM dates
    WHERE Val < CAST('2012-04-06' AS DATE)
)

SELECT d.val AS "Date", o.ohscdt, COALESCE(COUNT(o.ohtxn#), 0) AS "Count"
FROM dates AS d
LEFT JOIN KIVALIB.ORDHRPF AS o
  ON o.ohordt = TO_CHAR(d.val, 'YYYYMMDD')
WHERE o.ohstat = 'F'
  AND o.ohtyp = 1

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-09-04
    • 2022-11-10
    • 2021-01-26
    相关资源
    最近更新 更多