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サーバーはrow_numberをサポートしていないようです

4

3 に答える 3

2

これを試して;

同じ weekid の値が常に同じである場合は、a) を使用します。
同じ weekid の超過値が異なる場合:

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

1 つの値をランダムに選択できます。

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 に答える