0

我有这样的数据库:

weekid    overage    type    type2
504       400        x       y
504       400        z       y
503       200        x       z
502       100        x       x
502       100        x       y

我想要的是让来自 weekid 504 的 400 与 weekid 503 的 200 和来自 weekid 502 的 100 相加,我不希望它与来自 weekid 504 或 502 的其他 400 相加

所以输出应该是 sum(overage) = 700

基本上我想要的是像这样执行 vbscript 循环的东西

do until rs9.eof
    if weekid<>rs.fields("weekid") then
        weekid=rs.fields("weekid")
        overage=overage+rs.fields("overage")
    end if
rs.movenext
loop

但是它需要在查询中执行此操作,执行此操作的最简单的 sql 查询是什么?

我的 sql server 版本似乎也不支持 row_number

4

3 回答 3

2

试试这个;

如果相同weekids 的值总是相同,则使用a)。
对于相同的 weekid 具有不同的 overage 值的情况:

a)如果您需要将相同值的不同值包含在总和中:

SELECT  SUM([Overage])
FROM    ( SELECT DISTINCT
                    [WeekId] ,
                    [Overage]
          FROM      [dbo].[OverageTable]
        ) tmp

a)如果您只需要将相同值的最大不同值包含在总和中:

SELECT  SUM([Overage])
FROM    ( SELECT    [WeekId] ,
                    MAX([Overage]) AS [Overage]
          FROM      [dbo].[OverageTable]
          GROUP BY  [WeekId]
        ) tmp
于 2012-08-31T18:44:22.587 回答
0

这取决于你所说的第一行的意思——数据没有内在的顺序。order by当您决定如何订购时,您可以调整下面的子句。

select sum(overage)
from
    (Select overage, row_number() over (partition by weekid order by type, type2) rn
     from yourtable
    ) v
where rn=1
于 2012-08-31T18:06:40.927 回答
0

您可以随机选择一个值:

select sum(overage)
from (select t.*,
             row_number() over (partition by weekid order by newwid()) as seqnum
      from t
     ) t
where seqnum = 1

如果您知道所有值都相同,您可能更喜欢聚合:

select sum(overage)
from (select weekid, max(overage) as overage
      from t
      group by weekid
     ) t

不要执行以下操作:

select sum(distinct overage)

尽管这是有效的 SQL,但您将失去具有相同值的周数。

于 2012-08-31T18:07:12.633 回答