在“分组依据”语句中选择符合特定条件的行

时间:2012-12-20 22:19:50

标签: sql ms-access

对于按“名称”分组的记录,如何选择(在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

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如果每个G只有一行具有最小Name值,或者如果您愿意为{{1}接受多行,则SQL不会太困难当重复最小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,如果每G只需要一行,则更具挑战性。在这种情况下,您可以包含另一个子查询级别,该级别为Name加上最小ID的每个组合返回最小Name。并使用子查询的G和最小Name加入样本表。

ID

我在Access 2007中测试了两个查询,并将样本数据保存在名为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); 的表中。两者都返回了你要求的结果集。

注意我在第二个查询中使用SampleTableCLng()返回的值转换为DMin()。如果没有Long,则CLng()值将返回为MinOfG,这在联接中不起作用。