2011-06-02 101 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