从其他列

时间:2015-07-01 19:11:44

标签: sql sql-server sql-server-2008

我有一个查询,它将选择两个字段,对它们进行分组,然后根据第二个字段的第一个结果对结果进行排序。这两个领域之间存在一对多的关系。

select Product
    , Material
from dbo.Files
group by Product, Material
ORDER BY Product, MIN(Material)

结果正是我们想要的。实际上,实际上有几十个“10-001”记录,但我们只得到第一个。

Product     Material
10          001
10          002
10          003
10          004
10          005
10          006
10          007
10          008
10          009
11          001
11          009
13          012
13          013
13          014

问题是当我想显示其他列时。显然我不能选择其他列,除非我也将它们添加到group by语句中。但是,当我将它们添加到我的group by语句时,它会更改结果。

这就像我来的一样接近。

select Product
    ,Material
    ,XXIMPORT
    ,Field1
    ,Field2
    ,Field3
    ,Field4
    ,Field5
from dbo.files
where Field1 is not null
group by Product
    ,Material
    ,XXIMPORT
    ,Field1
    ,Field2
    ,Field3
    ,Field4
    ,Field5
ORDER BY Product
    , MIN(Material)
    , MIN(Field1)
    , MIN(Field2)

有了这些结果:

Product     Material    XXIMPORT    Field1          Field2
10          NULL        NULL        OUTER DIAMETER  CRITICAL FIT
10          001         5/27/15     Inside Diameter Cross Section
10          001         5/27/15     Part            INSIDE DIAMETER
10          002         5/27/15     OUTER DIAMETER  INSIDE DIAMETER
10          003         5/27/15     ID              OD
10          003         5/27/15     TYPE (TY)       Thickness (T)
10          011         5/27/15     OVERALL LENGTH  THREAD SIZE
10          012         5/27/15     Height (HT)     Outer Diameter (OD)

所以我知道为什么结果正在改变......但是我如何告诉SQL Serve只返回它在匹配的“其他”列中找到的第一个结果?例如,只是顶部的“10-001”行或顶部的“10-003”行。

一切都取决于第一个查询的结果。基于stackoverflow上看起来非常相似的其他帖子,我试图将第一部分放在具有典型结果的子查询中。我也尝试将表连接到自身并添加列,但我必须没有正确的语法。

2 个答案:

答案 0 :(得分:1)

您可以利用此处的ROW_NUMBER功能,根据产品和材料,按照您想要的顺序对行进行排序。

Half sync - half async

答案 1 :(得分:0)

首先,你的ORDER BY ... MIN()毫无意义。在您的分组字词中使用Material,因此每个组中只有1个可能的值,而MIN是多余的。

至于你的问题,从逻辑上讲,没有定义"第一个"或任何其他与订单相关的功能,除非您明确指定一个(例如使用ORDER BY)。

您需要明确告诉SQL您希望它做什么。

如果您真的不关心非分组列中的值,请执行以下操作:

1. you probably shouldn't include them in the result set anyway.
2. You could use one of:
  2.1. Correlated Subquery with TOP 1
  2.2. CROSS APPLY
  2.3. PARTITION BY
  2....