Можно ли не показывать столбцы без содержимого в sqlite? - PullRequest
1 голос
/ 12 марта 2020

У меня есть таблица с именами 700 инвестиционных портфелей ios в строках и с 70 классами активов в виде столбцов.

Каждый инвестиционный портфель состоит из нескольких классов активов в виде процентного значения. Многие портфели ios имеют только 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 или более строк, которые должны быть выведены.

1 Ответ

1 голос
/ 12 марта 2020

У вас есть несколько фондов и несколько классов активов. Каждый фонд может иметь несколько активов, и каждый актив может использоваться несколькими фондами. Это классическое c отношение «многие ко многим» , и лучше всего оно представлено в виде таблицы, объединяющей средства и активы с использованием соединительной таблицы , не пытаясь объединить все в одну таблица, как вы видите.

Идея состоит в том, чтобы иметь таблицу, описывающую средства (Имя, дата основания, сборы и т. д. c.), таблицу, описывающую классы активов, и третью таблицу, которая связывает два и содержат, сколько средств фонда выделено для этого класса активов, используя первичные ключи двух других таблиц в качестве внешних ключей.

Пример базы данных и некоторые примеры данных:

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.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...