Sql 在a";中选择符合特定条件的行;按“分类”;陈述
对于按“名称”分组的记录,如何选择(在MSAccess中)与列“G”中具有最小值的行对应的所有列(A-G)?这是一张样品表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
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
和minimumID
连接回示例表
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
和minimumID
连接回示例表
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列没有单个“名称”的重复项。再次感谢。。