3

私はまだSQLに慣れていないので、これにはちょっと困惑しています。助けやアドバイスをいただければ幸いです。値列と ID 列を含むテーブルがあり、値列で降順に並べ替えます。すなわち:

Value   | ID   
12      | A  
09      | A  
08      | B  
08      | C  
07      | A  
06      | B  
03      | B  
01      | C  

私は2つのことをしようとしています:

  1. 行ごとに、それぞれの ID の合計の割合を計算します。行 1 は 12/(12+9+7)、行 2: 3/(12+9+7)、行 3: 8/(8+6+3) などになります。
  2. IDごとに(1)で計算したパーセンテージの累計を計算します。基本的には、各 ID の累積合計です。

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

Value | ID | UnitValue | RunningTotal  
-------------------------------------
  12  | A  | 0.43      | 0.43  
  09  | A  | 0.32      | 0.75  
  08  | B  | 0.47      | 0.47  
  08  | C  | 0.89      | 0.89  
  07  | A  | 0.25      | 1.00  
  06  | B  | 0.35      | 0.82  
  03  | B  | 0.18      | 1.00  
  01  | C  | 0.11      | 1.00  
4

5 に答える 5

1

SQL Server 2012 または PostgreSQL では、ウィンドウ関数を使用でき、クエリはかなり単純になります。

;with cte as (
  select
      Value, ID,
      cast(sum(Value) over(partition by ID) as decimal(29, 10)) as sum_id
  from Table1
)
select
    Value, ID,
    cast(Value / sum_id as decimal(29, 2)) as UnitValue, 
    cast(sum(Value / sum_id) over(partition by ID order by Value desc) as decimal(29, 2)) as RunningTotal
from cte

あなたは例でSQLフィドルでそれを試すことができます

于 2013-08-08T04:55:35.870 に答える
1

SQL Server 2008 の場合

;WITH CTE 
AS
(
    SELECT
        Value
        ,ID
        ,CONVERT(DECIMAL(10,2),Value/CONVERT(DECIMAL(10,2),SUM(Value) OVER(PARTITION BY [ID]))) AS [Unit Value]
    FROM
        Table1 

)

SELECT a.Value,a.ID,a.[Unit Value], (SELECT SUM(b.[Unit Value])
               FROM   CTE b
               WHERE a.ID = b.ID AND b.[Unit Value] <= a.[Unit Value]) AS [RunningTotal]
FROM   CTE a
ORDER  BY a.ID,[RunningTotal]

SQL フィドルのデモ

于 2013-08-08T04:36:54.623 に答える
0

Oracle を使用している場合は、RATIO_TO_REPORTを使用して比率を計算し、SUMを分析関数として使用して累積合計を計算できます。

select value,
       id,
       r,
       sum(r) over (partition by id order by value desc) s
  from(
  select value,
         id,
         round(ratio_to_report(value) over (partition by id),2) r
    from mytable)
order by value desc;

SUMは他の DB で利用できますが、については不明ですRATIO_TO_REPORT

Oracle のデモはこちら

于 2013-08-08T04:06:43.790 に答える