2

sum(rev) 列の各行を列の合計で割る次のクエリがあります。

次の例では、sum(rev) 列の合計は 23193 です。Divide 列は次のように導出されます: sum(rev)/sum(rev) の行

select date,id,sum(rev), 
NULLIF(rev,0) / sum(rev) over() as Divide
from test 
where month(date) = 11
and year(date) = 2012
and day(date) = 02
and id = 'Client1'
group by date,id,rev
having sum(rev) <> 0
order by date


date                  id      sum(rev)      Divide

2012-11-02 00:00:00 Client1     1562.00     0.067348
2012-11-02 00:00:00 Client1     1.00        0.000043
2012-11-02 00:00:00 Client1     4689.00     0.202173
2012-11-02 00:00:00 Client1     267.00      0.011512
2012-11-02 00:00:00 Client1     16674.00    0.718924

2つの問題があります

1.) 日 (日付) 条件がコメント化されている場合、取得される値が間違っています。除算計算で正しい値が得られません。

    date               sum(rev)         Divide
    2012-11-02 00:00:00 1.00            0.000002
    2012-11-02 00:00:00 267.00          0.000412
    2012-11-02 00:00:00 1562.00         0.002412
    2012-11-02 00:00:00 4689.00         0.007241
    2012-11-02 00:00:00 16674.00        0.025749

2.) 日付ごとにグループ化したいので、2012 年 2 月 11 日のみのレコードがあるため、各日は 1 行のレコードのみである必要があります。

これらの 2 つのエラーの修正にご協力ください

参照:列の合計で割って列の値を見つける

4

1 に答える 1

2

グループ化して、1 日の合計を総合計で割りたい場合はdate、次のようにできます。

SELECT
  date,
  SUM(rev) AS total,
  SUM(rev) / SUM(SUM(rev)) OVER () AS portion
FROM test
GROUP BY
  date
;

つまり、 の引数はSUM() OVER ()有効な式である必要がありますが、GROUP BY に含まれていないrevため、この GROUP BY クエリでは有効な式でrevはありません。SUM(rev)しかし、引数として使用することはできます (また、使用する必要があります) 。期待どおりに機能します。

別のクライアントに対して別の結果が必要な場合は、次のようidに、GROUP BY 句に追加PARTITION BY idし、ウィンドウ SUM() の OVER 句に追加します。

SELECT
  date,
  id,
  SUM(rev) AS total,
  SUM(rev) / SUM(SUM(rev)) OVER (PARTITION BY id) AS portion
FROM test
GROUP BY
  date,
  id
;

OVER 句の詳細については、マニュアルを参照してください。

于 2012-10-29T13:27:28.050 に答える