2012-12-20 39 views
1

如何選擇(在MSAccess中)對應於列「G」中具有最小值的行的所有列(A-G),以便按「名稱」分組?下面是一個示例表在「分組依據」語句中選擇滿足特定條件的行

ID Name A B C D E F G 
1 CHRIS 30 -99 -99 0 0 0 239 
2 CHRIS 30 -99 -99 0 0 0 233 
3 CHRIS 30 -99 -99 0 0 0 120 
4 CHRIS 30 -99 -99 0 0 0 41 
5 CHRIS 40 1012 130 20 20 0 55 
6 KEITH 55 1012 230 175 150 50 178 
7 KEITH 55 1012 250 125 175 100 22 
8 KEITH 35 1012 270 25 25 0 76 
9 KEITH 40 1012 320 100 100 0 90 

中的結果將是:

CHRIS 30 -99 -99 0 0 0 41 

KEITH 55 1012 250 125 175 100 22 

謝謝!

+0

您是否有唯一的ID? – Fionnuala

+0

你的意思是記錄「名稱」?,每個名稱可能有一個數字與它關聯... –

+0

我的意思是你的表看起來像'1克里斯,2克里斯... 6基思' – Fionnuala

回答

1

的SQL是不是太困難,如果只有一個排,每個Name最小G值,或者如果你願意接受多行的Name重複最小G值時。使用子查詢,它返回G每個Name並將其加入到您的示例表中。

SELECT 
    smp.Name, 
    smp.A, 
    smp.B, 
    smp.C, 
    smp.D, 
    smp.E, 
    smp.F, 
    smp.G 
FROM 
    SampleTable AS smp 
    INNER JOIN (
     SELECT 
      [Name], 
      Min(G) AS MinOfG 
     FROM SampleTable 
     GROUP BY [Name] 
    ) AS sub 
    ON 
      (smp.Name = sub.Name) 
     AND (smp.G = sub.MinOfG); 

不過,如果你需要即使反覆爲Name最低GName只有一行是更具挑戰性。在這種情況下,您可以包含另一個子查詢級別,該級別返回每個組合Name加上最小值G的最小值ID。並使用子查詢的Name和最小值ID加入您的示例表。

SELECT 
    smp.Name, 
    smp.A, 
    smp.B, 
    smp.C, 
    smp.D, 
    smp.E, 
    smp.F, 
    smp.G 
FROM 
    SampleTable AS smp 
    INNER JOIN (
     SELECT 
      sub1.Name, 
      CLng(
       DMin(
        "ID", 
        "SampleTable", 
        "[Name]='" & [sub1].[Name] 
         & "' AND G=" & [sub1].[MinOfG] 
        ) 
       ) AS MinOfID 
     FROM 
      (
       SELECT 
        [Name], 
        Min(G) AS MinOfG 
       FROM SampleTable 
       GROUP BY [Name] 
      ) AS sub1 
    ) AS sub2 
    ON 
      (smp.Name = sub2.Name) 
     AND (smp.ID = sub2.MinOfID); 

我在Access 2007中測試了這兩個查詢,並將您的示例數據保存在名爲SampleTable的表中。並且都返回了您要求的結果集。

注意我在第二個查詢中使用了CLng()來將由DMin()返回的值轉換爲Long。如果沒有CLng(),則MinOfG值將返回爲String,這在連接中不起作用。

+0

太棒了,它工作正常!非常感謝!! –

+1

我使用了第一個,因爲G列沒有單個「名稱」的重複。再次感謝.. –

3

看看這是否會導致你在正確的方向。如果你有一個UserId和名字JOIN的話,會更好,因爲你不想在連接中出現重複。

SELECT 
    Table1.Name 
    , Table1.A 
    , Table1.B 
    , Table1.G 
FROM 
    Table1 
INNER JOIN Table1 as Table2 ON Table2.Name = Table1.Name 
GROUP BY Table1.Name , Table1.A, Table1.B, Table1.G 
HAVING Table1.G = MIN(Table2.G) 
+0

對不起,我迷失在用戶U和用戶U2 ...說我的表叫做Table1。我應該如何寫你提出的句子? –

+0

我已更新答案以反映您的問題。 U只是桌子的別名。以這種方式看待它應該有助於更好地形象化。 – CodeLikeBeaker

+0

@JasonHeine看來,奧利弗現在已經添加了一個ID。 – Fionnuala

相關問題