SQL项目占所有项目总计的百分比

时间:2013-08-29 10:00:54

标签: sql percentage

我有三个脑袋

Scheme| Account| Nav_date| Amount
DYFF  |INVEQU  | 25/01/2013|  100
DYFF  |INVCOD  | 25/01/2013|  100
GBGF  |INVEQU  | 25/01/2013|  200
GBGF  |INVCOD  | 25/01/2013|  100
DYFF  |INVEQU  | 26/01/2013|  150
DYFF  |INVCOD  | 26/01/2013|  150

对于Scheme =“DYFF”的每个日期,我想要一个SQL查询获取INVEQU的%到该日期的该日期的总金额

所以答案就像

Scheme| Account| nav_date| Percentage
DYFF  |INVEQU  |25/01/2013 | 50%
DYFF  |INVEQU  |26/01/2013 | 50%

我正在使用Oracle数据库

4 个答案:

答案 0 :(得分:0)

WITH Schemes AS
(
    SELECT
     *
    ,ROUND(CAST(Amount AS DECIMAL(18, 2))/SUM(Amount) OVER(PARTITION BY Scheme, Value_Date)*100, 2) AS Percentage
    FROM (VALUES
     ('DYFF'  ,'INVEQU'  , '25/01/2013',  100)
    ,('DYFF'  ,'INVCOD'  , '25/01/2013',  100)
    ,('GBGF'  ,'INVEQU'  , '25/01/2013',  200)
    ,('GBGF'  ,'INVCOD'  , '25/01/2013',  100)
    ,('DYFF'  ,'INVEQU'  , '26/01/2013',  150)
    ,('DYFF'  ,'INVCOD'  , '26/01/2013',  150)) v(Scheme, Account, Value_Date, Amount)
)
SELECT
 *
FROM Schemes
WHERE Scheme='DYFF'
AND Account='INVEQU';

或在你的情况下

WITH Schemes AS
(
    SELECT
     *
    ,ROUND(CAST(Amount AS DECIMAL(18, 2))/SUM(Amount) OVER(PARTITION BY Scheme, Value_Date)*100, 2) AS Percentage
    FROM YOUR_TABLE
)
SELECT
 *
FROM Schemes
WHERE Scheme='DYFF'
AND Account='INVEQU';

答案 1 :(得分:0)

试试这个:

  select scheme
       , 'INVEQU'    account
       , value_date
       , case tl
            when 0 then 0
            else        100*COALESCE(tl_i,0)/tl
         end         percentage
    from (
                select agg_i.tl             tl_i
                     , agg_tl.tl            tl
                     , agg_tl.scheme
                     , agg_tl.value_date
                  from (
                            select scheme
                                 , value_date
                                 , sum(amount)  tl
                              from table t_tl
                          group by scheme,
                                 , value_date
                        ) agg_tl 
              LEFT JOIN
                        (         
                            select scheme
                                 , value_date
                                 , sum(amount)  tl
                              from table t_i
                             where account = 'INVEQU'
                          group by scheme,
                                 , value_date
                        ) agg_i
                     ON (     agg_i.scheme       = agg_tl.scheme  
                          AND agg_i.value_date   = agg_tl.value_date  )        
          ) pct
          ;

答案 2 :(得分:0)

我会用这种简单的方法。强制CrossJoin只使用1个结果SUM表并将其应用于每一行。

SELECT 
     T.Scheme, T.Account, T.Nav_Date, SUM(T.Amount), SUM(T.Amount)/T2.Total
FROM 
    Table1 T,
    (SELECT SUM(Amount) as Total FROM Table1) T2
WHERE
    T.Scheme = 'DYFF'
GROUP BY
    T.Scheme, T.Account. T.Nav_Date

答案 3 :(得分:-1)

试试这个

select Scheme,Account,Value_date,sum(Amount)/amount as 'Percentage' from tablename where Scheme="DYFF" and Account="INVEQU" and value_date exist (select distinct(value_date) from tablename)

相关问题