SQL Server中的聚合和分组问题

时间:2017-08-29 22:15:19

标签: sql sql-server grouping aggregate

我创建了一个查询,按以下格式将成员记录的状态日期分组在一行:

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

有没有办法保留分组,以便所有状态日期都分组在一行上,但是还会保留记录,其中有多条记录的状态与我上面指出的相同?

2 个答案:

答案 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
相关问题