我有三个脑袋
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数据库
答案 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)