1

我有这样的记录:

    Id  ForeignKey  Level   ValueA  ValueB
    1   1001        1       2       10
    2   1001        1       10      10
    3   1001        1       20      20
    4   1001        2       20      30
    5   1002        1       1       100
    6   1003        1       1       100
    7   1004        1       1       100

我想获取按 ForeignKey 和 Level 分组的组的每条记录的 ID,其中组记录的 ValueA 值的总和除以 ValueB 值的总和大于 0.5

在这种情况下,我想检索前三个记录的 ID 为 (2 + 10 + 20) / (10 + 10 + 20) = 0.8

这是我到目前为止所得到的:

    select 
    ForeignKey,
    SUM(ValueA) as ValueASum,
    SUM(ValueB) as ValueBSum,
    from tableA 
    group by ForeignKey
    having (SUM(ValueA) / SUM(ValueB) > 0.5)

结果是

    ForeignKey  ValueASum   ValueBSum
    1001        32          40

如何从这一点获取记录的 ID?如果我在选择中添加 Id,我必须对其进行分组,然后为每条记录设置一个组。

谢谢你的时间

4

2 回答 2

1

你在正确的轨道上,但如果你想从每个“级别”中获得它,你还需要将它添加到你的组中。

select
      tA2.ID,
      tA2.ForeignKey,
      tA2.Level,
      tA2.ValueA,
      tA2.ValueB
   from
      ( select 
              tA.ForeignKey,
              tA.Level,
              SUM(tA.ValueA) as ValueASum,
              SUM(tA.ValueB) as ValueBSum,
           from 
              tableA tA
           group by 
              tA.ForeignKey,
              tA.Level
           having 
              (SUM(tA.ValueA) / SUM(tA.ValueB) > 0.5) ) PreQualified
      JOIN tableA tA2
         on PreQualified.ForeignKey = tA2.ForeignKey
        AND PreQualified.Level = tA2.Level

这将给出与限定条件匹配的所有值。

于 2013-05-28T10:51:58.437 回答
1

嗯,怎么样

select id from your_table where foreignkey = 1001

处理多个查询有问题吗?

如果你愿意,你可以做一个子查询:

select id from your_table where foreignkey in ( select foreignkey from ( <yourQuery> ) sq);

更新:

select t.id from Table1 t
inner join 
( 
    select 
    ForeignKey, level,
    SUM(ValueA) as ValueASum,
    SUM(ValueB) as ValueBSum
    from Table1 
where level = 1
    group by ForeignKey, Level
    having (SUM(ValueA) / SUM(ValueB) > 0.5) ) sq
ON t.foreignkey = sq.foreignkey AND t.level = sq.level

我添加where level = 1只是因为您给定的结果集不是我执行查询时得到的结果。

看到它在sqlfiddle中工作。

于 2013-05-28T10:38:47.273 回答