假设我有两个表:
表A 有关于不同投资基金的股票持有量的信息:
FundID FundType StockID Weight
1 Small A 0.50
1 Small B 0.50
2 Small B 0.25
2 Small C 0.75
3 Large A 1.00
4 Large D 1.00
表B 总结了每种基金在每种基金中的权重:
FundType StockID AvgWeight
Small A 0.25
Small B 0.375
Small C 0.375
Large A 0.5
Large D 0.5
(请注意,如果没有为基金列出股票,则假设权重为0.)
我想创建一个新表(使用SQL),对于表A中的每个FundID
,所有由相同类型的基金持有的股票都有:
期望的结果表:
FundID FundType StockID Weight AvgWeight
1 Small A 0.50 0.25
1 Small B 0.50 0.375
1 Small C 0.375
2 Small A 0.25
2 Small B 0.25 0.375
2 Small C 0.75 0.375
3 Large A 1.00 0.5
3 Large D 0.5
4 Large A 0.5
4 Large D 1.00 0.5
请注意,所有小型基金(A,B和C)持有的所有股票都包含在每个小型基金中(FundID为1或2)。同样,任何大型基金(A和D)持有的所有股票都包含在每个大型基金的结果中。
我认为我需要做一些外连接,但到目前为止还无法弄清楚SQL语法。有任何想法吗?谢谢!
答案 0 :(得分:2)
SELECT
ft.FundId
, ft.FundType
, fs.StockId
, aa.Weight --- or COALESCE(aa.Weight, 0) to display 0 and not NULL
, bb.AvgWeight
FROM
( SELECT DISTINCT
FundId
, FundType
FROM
TableA
) AS ft
INNER JOIN
( SELECT DISTINCT
FundType
, StockId
FROM
TableA
) AS fs
ON fs.FundType = ft.FundType
LEFT JOIN
TableB AS bb
ON bb.FundType = fs.FundType
AND bb.StockId = fs.StockId
LEFT JOIN
TableA AS aa
ON aa.FundId = ft.FundId
AND aa.FundType = ft.FundType
AND aa.StockId = fs.StockId
INNER fs LEFT JOIN bb
可以替换为简单INNER JOIN bb
,如果TableB
包含所有(FundType, StockId)
组合的行。
答案 1 :(得分:0)
有没有理由认为CROSS JOIN不适合解决这个问题?
似乎OP要求两个表之间所有可能的有效组合,这是CROSS的完美理由,不是吗?