0

我有一个类似的表:

ID  User_Code   ProcessID   DateCreated              Remarks
1     AAA           1        2020-01-01 08:40        N/A
2     AAA           2        2020-01-01 09:34        R123
3     AAA           2        2020-01-01 10:40        SUCCESS
4     AAA           3        2020-01-01 11:00        N/A
5     BBB           1        2020-01-01 11:01        N/A
6     BBB           1        2020-01-01 11:10        N/A 
7     BBB           2        2020-01-01 11:20        SUCCESS  
8     BBB           3        2020-01-01 11:30        N/A
9     CCC           1        2020-01-01 11:31        N/A
10    CCC           2        2020-01-01 11:40        R001 
11    CCC           2        2020-01-01 11:43        R002  

我想要完成的是创建这样的结果

TransDate  Remarks UserCode Process1 Process2 Process3
2020-01-01 SUCCESS AAA         OK       OK       OK   
2020-01-01 SUCCESS BBB         OK       OK       OK   
2020-01-01 R001    CCC         OK       OK       NOK  

如果特定用户代码的进程有记录,则要放置的列值是可以的,否则如果没有记录,则该值将是 NOK。此外,备注仅适用于 Process2,其值应为最新的备注。问题是它没有输出正确的结果,而是像这样显示

TransDate  Remarks UserCode Process1 Process2 Process3
2020-01-01         AAA         OK       OK       OK   
2020-01-01 SUCCESS BBB         OK       OK       OK   
2020-01-01 R001    CCC         OK       OK       NOK 

请参见下面创建的 SQL:

SELECT UserCode , DATE(DateCreated) AS TransDate,
IF (COUNT(
CASE
WHEN PROCESS = 1
THEN 1
ELSE NULL
END
) > 0, "OK", "NOK" ) AS 'Process1',
IF (COUNT(
CASE
WHEN PROCESS = 2
THEN 1
ELSE NULL
END
) > 0, "OK", "NOK" ) AS 'Process2',
IF (COUNT(
CASE
WHEN PROCESS = 3
THEN 1
ELSE NULL
END
) > 0, "OK", "NOK" )AS 'Process3'
FROM MyTable WHERE UserCode  = '######'
GROUP BY DATE(DateCreated)

不好意思,弄错了数据。记录应该是

ID  User_Code   ProcessID   DateCreated              Remarks
1     AAA           1        2020-01-01 08:40        N/A
2     AAA           2        2020-01-01 09:34        R123
3     AAA           2        2020-01-01 10:40        SUCCESS
4     AAA           3        2020-01-01 11:00        N/A
5     AAA           1        2020-01-02 11:01        N/A
6     AAA           1        2020-01-02 11:10        N/A 
7     AAA           2        2020-01-02 11:20        SUCCESS  
8     AAA           3        2020-01-02 11:30        N/A
9     AAA           1        2020-01-03 11:31        N/A
10    AAA           2        2020-01-03 11:40        R001 
11    AAA           2        2020-01-03 11:43        R002  
12    BBB           1        2020-01-03 11:32        N/A
13    BBB           2        2020-01-03 11:38        SUCCESS
14    BBB           3        2020-01-03 11:38        N/A

并且查询的结果应该与此类似,因为查询应该基于用户代码。

TransDate  Remarks UserCode Process1 Process2 Process3
2020-01-01 SUCCESS AAA         OK       OK       OK   
2020-01-02 SUCCESS AAA         OK       OK       OK   
2020-01-03 R002    AAA         OK       OK       NOK  
4

2 回答 2

1

简单的一点是使用条件聚合将行转换为列,较难的位连接到一个子查询,该查询计算出每个 user_code 的最后一个 id 并提取注释。

select min(date(datecreated)) dt,
         max(x.remarks),
         t.user_Code,
         max(case when processid = 1 then 'ok' else 'nok' end) process1,
         max(case when processid = 2 then 'ok' else 'nok' end) process2,
         max(case when processid = 3 then 'ok' else 'nok' end) process3 
from t 
left join 
    (
     select t.user_code,remarks
     from t
     join
      (select t1.user_code ucid, max(t1.id) maxid from t t1 where processid = 2 group by t1.user_Code) s
      on s.ucid = t.user_code and s.maxid = t.id
    ) x on x.user_code = t.user_code

group by t.user_code;

请注意,鉴于 user_Code ccc 的最新备注是 r002,我假设您所需输出中的备注不正确

于 2020-01-29T09:09:45.620 回答
0
SELECT DISTINCT
       MAX(DATE(DateCreated)) OVER (PARTITION BY User_Code) TransDate,
       FIRST_VALUE(CASE ProcessID WHEN 2 THEN Remarks END) OVER (PARTITION BY User_Code ORDER BY CASE ProcessID WHEN 2 THEN DateCreated END DESC) Remarks,
       User_Code,
       CASE WHEN MAX(CASE WHEN ProcessID = 1 THEN Remarks END) OVER (PARTITION BY User_Code) IS NULL THEN 'NOK' ELSE 'OK' END Process1,
       CASE WHEN MAX(CASE WHEN ProcessID = 2 THEN Remarks END) OVER (PARTITION BY User_Code) IS NULL THEN 'NOK' ELSE 'OK' END Process2,
       CASE WHEN MAX(CASE WHEN ProcessID = 3 THEN Remarks END) OVER (PARTITION BY User_Code) IS NULL THEN 'NOK' ELSE 'OK' END Process3
FROM test;
TransDate  Remarks User_Code Process1 Process2 Process3
2020-01-01 SUCCESS AAA       OK       OK       OK
2020-01-01 SUCCESS BBB       OK       OK       OK
2020-01-01 R002    CCC       OK       OK       NOK

小提琴

于 2020-01-29T08:54:28.717 回答