【发布时间】:2015-02-23 07:07:38
【问题描述】:
我正在使用 Oracle 10g,我想计算表 tmp_ord 中包含的行的不同状态。它包含以下数据。
下面有一组标记状态的规则
- 应该至少有一个状态为'ABC'的order_position,并且不应该有状态为'NON-ABC'的order_position具有相同的对应order_id,然后将状态标记为'ABC'。
- 应至少有一个状态为'NON-ABC'的order_position,并且不应有相应状态为'ABC'的order_position,然后将状态标记为'NON-ABC'。
- 如果对于相同的 ORDER_ID,至少有一个状态为“ABC”的 order_position 和至少一个状态为“NON-ABC”的 order_position,则将状态标记为“AMB”。
- 如果对应的 ORDER_ID 只有一个状态为 NULL 的 order_position,则将状态标记为“未知”。
- 假设 ABC 和 NULL 存在,那么它应该返回 ABC,如果 NOn-ABC 和 NULL 存在,那么它应该返回 'NON-ABC'......但是如果只存在单个 NULL 值,那么它应该返回 'UNKNOWN' 但是如果有 ALL'NULL' 值与 ORDER_ID UNIFORMLY 相关联,那么它应该返回 'NULL'
我写了下面的查询来计算数据,但得到一个对应于 ORDER_ID=6 的 NULL 值。
SELECT distinct ORDER_ID,CASE WHEN R1=0 THEN 'UNKNOWN'
WHEN R1=1 AND ORDER_STATUS='ABC' THEN 'ABC'
WHEN R1=1 AND ORDER_STATUS<>'ABC' THEN 'NON-ABC'
WHEN R1>1 THEN 'MD'
END STATUS
,CASE WHEN R2=0 THEN 'UNKNOWN'
WHEN R2=1 AND ORDER_STATUS_1='ABC' THEN 'ABC'
WHEN R2=1 AND ORDER_STATUS_1<>'ABC' THEN 'NON-ABC'
WHEN R2>1 THEN 'MD'
END STATUS_1
FROM
(
SELECT ORDER_ID,ORDER_STATUS,ORDER_STATUS_1,
COUNT(DISTINCT order_status) OVER (PARTITION BY ORDER_ID) R1
,COUNT(DISTINCT order_status_1) OVER (PARTITION BY ORDER_ID) R2
FROM TMP_ORD
ORDER BY ORDER_ID
);
我低于输出。请让我知道如何抑制与 ORDER_ID=6 关联的行,它给出 STATUS=NULL... 它应该是“ABC”,因为它至少包含一个“ABC”并且没有“NON-ABC”的状态。
【问题讨论】:
-
我写了下面的查询来计算数据,但得到一个对应于 ORDER_ID=6 的 NULL 值。
标签: sql oracle window-functions