2011-06-02 73 views
1

我在mysql中运行一个报告,它返回所有活动成员及其关联的计划选择。如果会员终止,则会在报告中显示。然而,我面临的问题是,一个成员只是决定“改变”计划。我们的系统有效'终止'原始计划,并在保留会员原始注册信息的同时开始新计划。如何根据MySQL中唯一ID的多个结果选择MAX记录

样本报告数据可以看起来如下:

MemberID | Last | First | Plan Code | Original Effective | Change Date | Term Date 
-------------------------------------------------------------------------------------------- 
12345 | Smith | John |  A  | 05-01-2011  |    | 06-01-2011 
12345 | Smith | John |  B  | 06-01-2011  |    |  

在上面的例子中,构件具有计划码A从2011年5月1日至2011年6月1日,2011年6月1日,构件将其覆盖范围改为计划B(并且自从没有任何条款或更改数据以来仍然有效)。

最后,我需要我的报告生成,而不是上面的2个以下项目:

MemberID | Last | First | Plan Code | Original Effective | Change Date | Term Date 
-------------------------------------------------------------------------------------------- 
12345 | Smith | John |  B  | 05-01-2011  | 06-01-2011 | 

这说明他原来的计划生效之日起,变更的日期,并离开终止领域的空白。

我知道我可以通过使用Group By the Member ID进入单行,我甚至可以使用(IF COUNT()> 1)语句将更改日期添加到适当的字段中,但我无法计算出了解如何显示正确的计划代码(C)或如何将期限日期保留原始生效日期。

任何想法?

+1

我已经添加了“最大每个组的标签”。按照该链接,你会看到许多其他答案,以解决同样的问题。 – 2011-06-02 16:58:04

回答

1

的东西。虽然我讨厌列嵌入式空间和具有tick他们,这应该为你做。 PreQuery将检测那里有多少个策略条目,保留第一个也是最后一个,按成员分组。一旦完成,它可以重新加入同一成员的计划注册,但只与该人的最后一个“原始有效”日期相匹配......这将为您提供正确的计划代码。另外,如果这个人被终止,那么这个日期将会被填写。如果仍然被雇用,则在该记录上将是空白的。

select STRAIGHT_JOIN 
     pe2.MemberID, 
     pe2.Last, 
     pe2.First, 
     pe2.`Plan Code` 
     PreQuery.PlanStarted `Original Effective`, 
     case when PreQuery.PlanEntries > 1 then PreQuery.LastChange end `Change Date`, 
     pe2.`Term Date` 
    from 
     (select 
       pe.MemberID, 
       count(*) as PlanEntries, 
       min(`pe`.`Original Effective`) PlanStarted, 
       max(`pe`.`Original Effective`) LastChange 
      from 
       PlanEnrollment pe 
      group by 
       pe.MemberID) PreQuery 

    join PlanEnrollment pe2 
     on PreQuery.MemberID = pe2.MemberID 
     AND PreQuery.LastChange = pe2.`Original Effective` 
+0

什么意思列嵌入空格? – JM4 2011-06-02 22:59:24

+0

@ JM4,只是为了通过报告匹配你的列名,而不知道实际的列名......有些人实际上是有空格的列,比如“Last Name”而不是“LastName”。如果列中定义的列中有空格,则必须在列的周围使用“tick”字符,就像我在本文/答案中所做的那样。如果您的列名实际上不是“原始有效”之类的东西,那么您显然必须将查询调整为您的表结构。这个查询应该为你解决问题。 – DRapp 2011-06-03 01:00:11

0

我记得有问题,但不带GROUP未来增长为基础的解决方案;) 相反,我认为你可以像

SELECT memberid, plancode 
FROM members 
INNER JOIN plans ON members.id=plans.member_id 
WHERE plans.id IN 
    (SELECT id FROM plans 
    WHERE member_id = members.id 
    ORDER BY date DESC 
    LIMIT 0,1) 
+0

@ Nicholas78 - 从来没有想过在哪里解决方案,很好的建议。只有我看到它的问题是,我的结果查询确实需要顶部查询的* both *结果的一部分。它需要从结果2中拉出计划,原始生效从1开始,动态更改日期和期限日期从2开始。让我疯狂! – JM4 2011-06-02 16:46:10

相关问题