Sql 在a";中选择符合特定条件的行;按“分类”;陈述

Sql 在a";中选择符合特定条件的行;按“分类”;陈述,sql,ms-access,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

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


谢谢

看看这是否会把你引向正确的方向。如果您有一个UserId而不是名称来加入,那就更好了,因为您不希望在加入中出现重复的结果

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)

看看这是否会把你引向正确的方向。如果您有一个UserId而不是名称来加入,那就更好了,因为您不希望在加入中出现重复的结果

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)

如果每个
Name
只有一行具有最小
G
值,或者当重复最小
G
值时,您愿意为
Name
接受多行,那么SQL就不会太难了。使用子查询返回每个
Name
的最小
G
,并将其连接到示例表中

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);
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);
但是,如果每个
名称
只需要一行,则更具挑战性,即使该
名称重复最小
G
。在这种情况下,您可以包含另一个子查询级别,该子查询级别为
Name
的每个组合返回最小
ID
,再加上最小
G
。并使用子查询的
Name
和minimum
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
            [Name],
            Min(G) AS MinOfG
        FROM SampleTable
        GROUP BY [Name]
    ) AS sub
    ON
            (smp.Name = sub.Name)
        AND (smp.G = sub.MinOfG);
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
返回,该字符串在联接中不起作用

如果每个
Name
只有一行具有最小
G
值,或者当重复最小
G
值时,您愿意为
Name
接受多行,那么SQL并不太难。使用子查询返回每个
Name
的最小
G
,并将其连接到示例表中

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);
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);
但是,如果每个
名称
只需要一行,则更具挑战性,即使该
名称重复最小
G
。在这种情况下,您可以包含另一个子查询级别,该子查询级别为
Name
的每个组合返回最小
ID
,再加上最小
G
。并使用子查询的
Name
和minimum
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
            [Name],
            Min(G) AS MinOfG
        FROM SampleTable
        GROUP BY [Name]
    ) AS sub
    ON
            (smp.Name = sub.Name)
        AND (smp.G = sub.MinOfG);
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
返回,该字符串在联接中不起作用

你有唯一的ID吗?你是说记录“名称”?每个名称可能都有一个与之关联的数字…我的意思是你的表看起来像
1克里斯,2克里斯…6基思吗不太像,但我想这些可以添加…如果没有唯一的ID,生活会更加困难,除非你没有很多记录。你有一个唯一的ID吗?你是说记录“名称”?每个名称都可能有一个与之关联的数字…我的意思是你的表看起来像
1克里斯,2克里斯…6基思吗?
不太像,但我想可以添加这些ID…没有唯一的ID,生活会更加困难,除非你没有太多的记录。对不起,我对用户U和用户U2感到迷茫…假设我的表名为Table1。我应该如何写你建议的句子?我已经更新了答案以反映你的问题。U只是表的别名。这样看应该有助于更好地可视化。@JasonHeine Oliver现在似乎添加了一个ID。我收到一条错误消息说:“您试图执行一个查询,但该查询不包括作为聚合函数一部分的…”Table1.G=MIN(Table2.G)““对不起,我与用户U和用户U2失去联系了……请告诉我,我的表名为Table1。”。我应该如何写你建议的句子?我已经更新了答案以反映你的问题。U只是表的别名。这样看应该有助于更好地可视化。@JasonHeine看起来Oliver现在已经添加了一个ID。我收到一条错误消息说:“您试图执行一个查询,但该查询不包括作为聚合函数一部分的…”Table1.G=MIN(Table2.G)““我使用了第一个,因为G列中的单个“名称”没有重复项。”。再次感谢..我使用了第一个,因为G列没有单个“名称”的重复项。再次感谢。。