【发布时间】:2017-12-26 21:32:48
【问题描述】:
我正在处理以下查询:
SELECT contract,
source_ref1 AS "ORDER_NO",
part_no,
ifsapp.inventory_part_api.Get_description( contract, part_no ) as "DESCRIPTION",
ifsapp.inventory_part_api.Get_unit_meas( contract, part_no ) as "UNIT_MEAS",
date_applied,
(SELECT work_center_no FROM shop_order_operation where inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER",
direction,
SUM( quantity ) AS "QUANTITY",
( CASE
WHEN ( ( To_char( date_time_created, 'HH24:MI ' ) BETWEEN '05:45 ' AND '17:44' ) AND
date_applied = date_created ) THEN 'SHIFT1'
WHEN (( ( To_char( date_time_created, 'HH24:MI' ) BETWEEN '17:45' AND '24:00' ) OR
( To_char( date_time_created, 'HH24:MI' ) BETWEEN '00:00' AND '05:44' ) AND
date_applied = date_created )) THEN 'SHIFT2'
ELSE 'MANUAL_ADJUST'
END ) AS "SHIFT"
FROM ifsapp.INVENTORY_TRANSACTION_HIST2
WHERE part_no IN (select pc.part_no from ifsapp.HH_INV_PART_CHARS pc where pc.accounting_group = '400') AND
contract IN ( 'DE1', 'DE2' ) AND
transaction_code LIKE '%REC%' AND
direction IN ( '+', '-' ) AND
source_ref_type = 'Shop Order' AND
To_char( date_applied, 'YYYY-MM-DD' ) BETWEEN '2017-01-01' AND '2017-12-26'
GROUP BY contract,source_ref1, part_no, ifsapp.inventory_part_api.Get_description( contract, part_no ),
ifsapp.inventory_part_api.Get_unit_meas( contract, part_no ), location_no, date_applied, direction,
date_time_created, date_created
ORDER BY date_applied
此查询返回 18292 个匹配项。
如果我删除 CASE 语句,并从 GROUP BY 部分中删除 DATE_TIME_CREATED 和 DATE_CREATED,则查询将返回 1356 个命中。
我们使用 CASE 语句来确定我们的产品产生了什么转变。 date_time_created 字段基本上是一个时间戳。这是该表上唯一可以用来确定产品生产班次的字段。
但是,它也导致我们获得的点击数是没有它时的 10 倍。
以 ORDER_NO 349321 为例。如图所示运行查询,我得到 61 次点击。删除 CASE 语句,并从 GROUP BY 部分中删除 DATE_TIME_CREATED 和 DATE_CREATED,我得到两个命中。
我们没有两班倒完成的订单。因此,我不需要知道 ORDER_NO 349321 的每笔交易的时间戳,也不需要知道每个时间戳是在 Shift 1 还是 Shift 2。我只需要知道该订单的交易是否是在 Shift 1 或 Shift 2 中完成。
有没有什么方法可以汇总我从案例陈述中获得的信息来解决这个问题?我尝试在我的 case 语句中使用 MAX 和 AVG,但它返回的结果数量相同。
【问题讨论】:
-
提供有代表性的数据样本和期望的结果。
-
除非您是故意这样做的,否则您在“SHIFT 2”计算中的 OR 条件周围似乎缺少一组括号。现在的方式是,“AND”条件不被视为“AND”,因为 OR 没有链接到任何其他条件。
( ( ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '17:45' AND '24:00' ) OR ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '00:00' AND '05:44' ) AND date_applied = date_created ) )这并不能解决您最初的问题,但现在需要注意。
标签: sql oracle11g timestamp case aggregate-functions