5

SQL Server に次のテーブルがあるとします。

grp:     val:     criteria:
a        1        1
a        1        1
b        1        1
b        1        1
b        1        1
c        1        1
c        1        1
c        1        1
d        1        1

今私が欲しいのは、基本的に次のような出力を得ることです:

Select grp, val / [sum(val) for all records] grouped by grp where criteria = 1

したがって、次の場合は true です。

Sum of all values = 9
Sum of values in grp(a) = 2
Sum of values in grp(b) = 3
Sum of values in grp(c) = 3
Sum of values in grp(d) = 1

出力は次のようになります。

grp:     calc:    
a        2/9        
b        3/9        
c        3/9        
d        1/9

私のSQLはどのように見える必要がありますか??

ありがとう!!

4

2 に答える 2

5

を使用するこのようなものを使用できるはずですsum() over()

select distinct grp,
  sum(val) over(partition by grp)
    / (sum(val) over(partition by criteria)*1.0) Total
from yourtable 
where criteria = 1

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| GRP |          TOTAL |
------------------------
|   a | 0.222222222222 |
|   b | 0.333333333333 |
|   c | 0.333333333333 |
|   d | 0.111111111111 |
于 2013-01-16T16:45:10.493 に答える
1

私は@bluefeetの応答に完全に同意します-これはデータベースに依存しないアプローチのほんの少しです(ほとんどのRDBMSで動作するはずです):

select distinct
  grp,
  sum(val)/cast(total as decimal)
from yourtable 
cross join 
(
  select SUM(val) as total 
  from yourtable
) sumtable
where criteria = 1
GROUP BY grp, total

そして、ここにSQL Fiddleがあります。

于 2013-01-16T16:58:20.593 に答える