我有一个表,行中有700个投资组合的名称,列中有70个资产类别。
每个投资组合由几个资产类别组成,以百分比价值表示。许多投资组合只有3-5个资产类别,而有些则有20个。
现在,我希望输出的每个投资组合只包含其包含的资产类,所以我不希望显示没有内容的列。我使用SQLite命令行界面来创建输出。
每个输出应该在一行上。
这就是我现在要做的。我使用投资组合组成的资产类别手动选择列。我只是认为有700行,可能会有更聪明的方法。
SELECT PortfolioName,
TotalUSMarket AS "Total US Market",
RealEstate AS "REITs",
InternationalDeveloped AS "International Developed",
TotalBondMarket AS "Total Bond Market",
Commodities AS "Commodities"
FROM PortfolioAllocation
WHERE PortfolioAllocation.PortfolioNumber_id IN (10);某些输出有2行或更多行需要输出。
发布于 2020-03-12 22:12:12
您有多个基金和多个资产类别。每个基金可以有多个资产,每个资产可以被多个基金使用。这是一个经典的many to many relationship,最好的表现是使用junction table连接基金和资产的多表设计,而不是像您看到的那样,试图将所有东西都放到一个表中。
其思想是有一个表描述基金(名称、成立日期、费用等),一个表描述资产类别,第三个表将这两个表联系起来,并使用另外两个表的主键作为外键,保存有多少基金投入到该资产类别中。
示例数据库和一些示例数据:
CREATE TABLE investment_fund(id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE asset_class(id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE investment_percentages(
fund_id INTEGER REFERENCES investment_fund(id),
asset_id INTEGER REFERENCES asset_class(id),
percentage REAL,
PRIMARY KEY(fund_id, asset_id)) WITHOUT ROWID;
CREATE VIEW fund_ownership AS
SELECT fund_id, if.name AS fund_name, asset_id, ac.name AS asset_name
, percentage
FROM investment_fund AS if
JOIN investment_percentages AS i ON if.id = i.fund_id
JOIN asset_class AS ac ON i.asset_id = ac.id;
INSERT INTO investment_fund VALUES (1, 'No Bonds Here');
INSERT INTO investment_fund VALUES (2, 'We Do Bonds');
INSERT INTO asset_class VALUES (1, 'Municipal Bond Market');
INSERT INTO asset_class VALUES (2, 'REIT');
INSERT INTO asset_class VALUES (3, 'S&P500 Index');
INSERT INTO investment_percentages VALUES (1, 2, 40);
INSERT INTO investment_percentages VALUES (1, 3, 60);
INSERT INTO investment_percentages VALUES (2, 1, 75);
INSERT INTO investment_percentages VALUES (2, 3, 25);然后,您可以获得特定基金拥有的所有类别的列表,并且只包含这些类别,而不必提前知道它们是什么:
sqlite> SELECT * FROM fund_ownership WHERE fund_name = 'We Do Bonds' ORDER BY percentage DESC;
fund_id fund_name asset_id asset_name percentage
---------- ----------- ---------- --------------------- ----------
2 We Do Bonds 1 Municipal Bond Market 75.0
2 We Do Bonds 3 S&P500 Index 25.0https://stackoverflow.com/questions/60650455
复制相似问题