3

我的 SQL 数据库中有下表。

DIM_BENCHMARK:
Fund_sk | Num_Bench | Bench | Weight | Type_Return
   1          2        XXX      0.9        TR
   1          2        YYY      0.1        Net
   2          3        XXX      0.45       TR
   2          3        YYY      0.45       TR
   2          3        ZZZ      0.10       Net

FACT_Returns:
 Date   | Bench |  TR   |   Net  
 10/10    XXX    0.010    0.005 
 10/10    YYY    0.012    0.008
 10/10    ZZZ    0.006    0.012

存储过程的期望输出:

FACT_Result:
 Date   | Fund_SK | Num_Bench |      Bench_Returns
 10/10     1           2         (eg. 0.9*TR of XXX) + (0.1*Net Return of YYY) 
 10/10     2           3         (eg. 0.45*TR of XXX) + (0.45*TR of YYY) + (0.10*Net of ZZZ)

上面的表格显示了我的输入数据的格式和我想要的输出。我对 SQL 还是相当陌生,而且这个动态 SQL 查询已经超出了我的知识深度。

我想根据 DIM_Benchmark.Type_Return 中的规范将数字(FACT_Returns.TR 或 .Net)乘以 DIM_Benchmark.weight。DIM_Benchmark.Type_Return 中的变量与 FACT_Returns 中的列标题相同。

与往常一样,非常感谢任何帮助!

4

3 回答 3

3

你的主要问题是你的事实表。它没有正确标准化 - 每个值都应该有一行。

下面unpivot的 SQL 对数据进行规范化。

select
    [date], fund_sk,Num_Bench, sum(weight * val)    
from 
(
    select * 
    from fact_returns   
    unpivot (val for type in (tr, net)) u 
) f
    inner join dim_benchmark b
        on f.bench = b.Bench
        and f.type = b.Type_Return
group by [date], fund_sk, Num_Bench
于 2013-10-15T16:38:00.573 回答
2

这应该可以解决问题,并且也可以在任何 DBMS 中使用:

SELECT fr.date, db.fund_sk, db.num_bench, sum(db.weight *
  CASE db.type_return
    WHEN 'TR' THEN fr.tr
    WHEN 'Net' THEN fr.net
    ELSE 0
  END) Bench_Returns
FROM dim_benchmark db
JOIN fact_returns fr ON db.bench = fr.bench
GROUP BY fr.date, db.fund_sk, db.num_bench

请记住,我确保TRNet考虑SUM. 如果您只有TRandNet在该列中,则可以将大小写更改为:

  CASE db.type_return
    WHEN 'TR' THEN fr.tr
    ELSE fr.net
  END

哪个会运行得更快一些。

输出:

|  DATE | FUND_SK | NUM_BENCH | BENCH_RETURNS |
|-------|---------|-----------|---------------|
| 10/10 |       1 |         2 |        0.0098 |
| 10/10 |       2 |         3 |        0.0111 |

在这里拉小提琴。

于 2013-10-15T17:00:58.603 回答
0

您可以使用案例来计算每一行,并将它们适当地汇总。

select
     _BenchResults.date
    ,_BenchResults.Fund_SK
    ,_BenchResults.Num_Bench
    ,sum(_BenchResults.benchReturns) as benchReturns
from (
    select
         FACT_Result.date
        ,DIM_BENCHMARK.Fund_SK
        ,DIM_BENCHMARK.Num_Bench
        ,case when DIM_BENCHMARK.Type_Return = 'TR' then
            DIM_BENCHMARK.Weight * FACT_Result.tr
         when DIM_BENCHMARK.Type_Return = 'Net' then
            DIM_BENCHMARK.Weight * FACT_Result.net
         else
            0
         end as benchReturns
    from DIM_BENCHMARK
    join FACT_Result
        on FACT_Result.bench = DIM_BENCHMARK.bench
) _BenchResults
group by
     _BenchResults.date
    ,_BenchResults.Fund_SK
    ,_BenchResults.Num_Bench
于 2013-10-15T16:42:21.317 回答