2

我有一个表名是ProductDirection。它包括这些列。

  1. 操作码
  2. 消息代码
  3. 产品编号
  4. 消息信息
  5. 状态码
  6. 插入日期

我有一个批处理程序,这个程序最多可以工作。一个产品一天3次。如果一个产品批次操作成功,该产品当天批次不工作。所以程序会在成功和插入记录失败或成功时工作。

我的记录是:

ProductNo  StatusCode  MessagesInfo     InsertDate
---------------------------------------------------------   
1236895     0          Fail For xxx     01.01.2013 10:00:00
1236895     0          Fail For yyy     01.01.2013 15:00:00
1236895     1          Success          01.01.2013 19:00:00
1236895     0          Fail For xxx     15.01.2013 10:00:00
1236895     0          Fail For yyy     15.01.2013 15:00:00
1236895     0          Fail For zzz     15.01.2013 19:00:00

我想要这个条件。如果它有可用的成功记录,我只想在一天内获得此记录,如果所有记录在一天内都是失败的。所以我的记录会是这样的。

ProductNo  StatusCode MessagesInfo    InsertDate
------------------------------------------------------    
1236895     1         Success         01.01.2013 19:00:00 
1236895     0         Fail For xxx    15.01.2013 10:00:00
1236895     0         Fail For yyy    15.01.2013 15:00:00
1236895     0         Fail For zzz    15.01.2013 19:00:00

我该如何解决?

SELECT *
  FROM ProductDirection p
 WHERE p.operationcode = 6
   AND p.messagecode = 2
   AND trunc(p.insertdate) BETWEEN '01.01.2013' AND '21.06.2013';
4

2 回答 2

1

尝试这个。

编辑 :

SELECT *
  FROM productdirection
 WHERE (productno, TRUNC (insertdate)) IN (
                                        SELECT   productno,
                                                 TRUNC (insertdate)
                                            FROM productdirection
                                        GROUP BY productno,
                                                 TRUNC (insertdate)
                                          HAVING MAX (statuscode) = 0)
    OR statuscode = 1;

sqlfiddle在这里

根据需要添加任何其他 where 子句。

于 2013-06-24T08:33:45.400 回答
0
WITH ProductDirection AS
(
SELECT 1236895 ProductNo, 0 StatusCode, 'Fail For xxx' MessagesInfo, TO_DATE('01.01.2013 10:00:00', 'DD.MM.YYYY HH24:MI:SS') InsertDate FROM DUAL UNION ALL
SELECT 1236895, 0, 'Fail For yyy', TO_DATE('01.01.2013 15:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 1236895, 1, 'Success',      TO_DATE('01.01.2013 19:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 1236895, 0, 'Fail For xxx', TO_DATE('15.01.2013 10:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 1236895, 0, 'Fail For yyy', TO_DATE('15.01.2013 15:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 1236895, 0, 'Fail For zzz', TO_DATE('15.01.2013 19:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL
)
SELECT *
   FROM ProductDirection
  WHERE insertdate >=   (
                            SELECT  MAX(InsertDate)
                            FROM    ProductDirection
                            WHERE   MessagesInfo = 'Success'
                            AND     InsertDate >= TO_DATE('01.01.2013', 'DD.MM.YYYY')
                        )
  ORDER BY insertdate;
/*
1236895 1   Success         2013-01-01 19:00:00
1236895 0   Fail For xxx    2013-01-15 10:00:00
1236895 0   Fail For yyy    2013-01-15 15:00:00
1236895 0   Fail For zzz    2013-01-15 19:00:00
*/
于 2013-06-24T08:19:38.250 回答