我创建了一个查询,按以下格式将成员记录的状态日期分组在一行:
http://192.168.1.83:8010
在这种特殊情况下,前3个状态为空,但可以填充它们。 我使用以下查询创建了这个:
MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate
10 NULL NULL NULL 08/20/2017
我发现的问题是,如果某个成员有2个具有不同日期的已批准记录,则只有一个显示为P4StatusDate。例如:
select memberid, max(case when statustype = 'Applicant' then cast(B.statusdate as date)end) as P1StatusDate
max(case when B.statustype = 'Pending' then cast(B.statusdate as date)end) as P2StatusDate
max(case when B.statustype = 'In Progess' then cast(sh.statusdate as date)end) as P3StatusDate
max(case when B.statustype = 'Approved' then cast(B.statusdate as date)end) as P4StatusDate
from Table A
inner join B
on A.statusdate = B.statusdate
group by memberid
这显示为:
MemberID Status StatusDate
10 Approved 08/19/2017
10 Approved 08/20/2017
省略了08/19/2017的记录。
如果我更改查询以将statusdate包含在group by中,它将正确填充此成员的两个记录。
MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate
10 Null Null Null 08/20/2017
但是,这也会导致每个statusdate记录显示在其他成员的不同行上:
MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate
10 Null Null Null 08/19/2017
10 Null Null Null 08/20/2017
有没有办法保留分组,以便所有状态日期都分组在一行上,但是还会保留记录,其中有多条记录的状态与我上面指出的相同?
答案 0 :(得分:0)
聚合聚合派生表
select memberid, max(p1date), max(p2date), max(p3date), max(p4date)
from (
select ..... -- your raw grouping with nulls
from table
group by ...
) x
group x.memberid
答案 1 :(得分:0)
从您的SQL查询
WITH t_status AS
(
SELECT memberid, [status],
CASE WHEN [status] = 'Applicant' THEN statusdate ELSE NULL END P1StatusDate,
CASE WHEN [status] = 'Pending' THEN statusdate ELSE NULL END P2StatusDate,
CASE WHEN [status] = 'In Progress' THEN statusdate ELSE NULL END P3StatusDate,
CASE WHEN [status] = 'Approved' THEN statusdate ELSE NULL END P4StatusDate,
ROW_NUMBER() OVER (PARTITION BY memberid, [status] ORDER BY statusdate) rnum
FROM t_member_status -- your table name
)
SELECT memberid,
MAX(P1StatusDate) P1StatusDate,
MAX(P2StatusDate) P2StatusDate,
MAX(P3StatusDate) P3StatusDate,
MAX(P4StatusDate) P4StatusDate
FROM t_status
GROUP BY memberid, rnum
ORDER BY memberid, rnum
结果(添加了一个示例数据memberid 20来模拟具有其他状态值且具有相同成员身份的相同状态的其他记录)
memberid P1StatusDate P2StatusDate P3StatusDate P4StatusDate
10 NULL NULL NULL 2017-08-19
10 NULL NULL NULL 2017-08-20
15 2017-01-01 2017-03-01 2017-04-01 2017-05-01
20 2017-01-01 2017-03-01 2017-04-01 2017-05-01
20 NULL NULL NULL 2017-05-02