|
| 1 | +CREATE TABLE IF NOT EXISTS 'users' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL |
| 2 | + ,'username' TEXT NOT NULL |
| 3 | + ,'hash' TEXT NOT NULL |
| 4 | + ,'cash' NUMERIC NOT NULL DEFAULT 10000.00 |
| 5 | + ); |
| 6 | + |
| 7 | +CREATE TABLE sqlite_sequence(name,seq); |
| 8 | + |
| 9 | +CREATE UNIQUE INDEX 'username' ON "users" ("username"); |
| 10 | + |
| 11 | +CREATE TABLE names(first_name TEXT NOT NULL, |
| 12 | + last_name VARCHAR(255) NOT NULL, |
| 13 | + email_address TEXT NOT NULL, |
| 14 | + name_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
| 15 | + FOREIGN KEY(name_id) REFERENCES users(id) |
| 16 | + ); |
| 17 | + |
| 18 | +CREATE TABLE IF NOT EXISTS 'companies' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL |
| 19 | + ,'name' TEXT NOT NULL |
| 20 | + ,'symbol' VARCHAR(4) NOT NULL UNIQUE |
| 21 | + ,'exchange' TEXT NOT NULL |
| 22 | + ); |
| 23 | + |
| 24 | +CREATE TABLE cash (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
| 25 | + datetime DATETIME NOT NULL, |
| 26 | + debit REAL NOT NULL, |
| 27 | + credit REAL NOT NULL, |
| 28 | + user_id INTEGER NOT NULL |
| 29 | + ,trans_id VARCHAR(20), |
| 30 | + FOREIGN KEY(user_id) REFERENCES users (id) |
| 31 | + ); |
| 32 | + |
| 33 | +CREATE TABLE IF NOT EXISTS 'transactions' (trans_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
| 34 | + datetime DATETIME NOT NULL, |
| 35 | + price REAL NOT NULL, |
| 36 | + quantity INTEGER NOT NULL, |
| 37 | + total REAL NOT NULL, |
| 38 | + ordertype TEXT NOT NULL, |
| 39 | + c_id INTEGER NOT NULL, |
| 40 | + user_id INTEGER NOT NULL, |
| 41 | + CHECK (ordertype IN ('BUY', 'SELL')), |
| 42 | + FOREIGN KEY(c_id) REFERENCES companies (id), |
| 43 | + FOREIGN KEY(user_id) REFERENCES users (id) |
| 44 | + ); |
| 45 | + |
| 46 | +WITH indexSetup AS ( |
| 47 | + SELECT u.username, c.symbol, c.name, t.c_id, t.ordertype, SUM(u.cash) AS cash, SUM(t.quantity) as quantity, SUM(t.quantity * t.price) AS total FROM transactions t |
| 48 | +JOIN companies c ON t.c_id = c.id JOIN users u ON t.user_id = u.id WHERE user_id =1 GROUP BY 1, 2, 3, 4, 5) |
| 49 | +,sell AS(SELECT username, symbol, name, c_id, SUM(cash) AS cash, SUM(quantity) AS quantity , SUM(total) AS costBasis FROM indexSetup WHERE ordertype = 'SELL' GROUP BY 1, 2, 3, 4) |
| 50 | + |
| 51 | +, buy AS(SELECT username, symbol, name, c_id, SUM(cash) AS cash, SUM(quantity) AS quantity , SUM(total) AS costBasis FROM indexSetup WHERE ordertype = 'BUY' GROUP BY 1, 2, 3, 4) |
| 52 | + |
| 53 | +,results AS( |
| 54 | + SELECT username, symbol, name, c_id, cash, |
| 55 | + COALESCE(SUM(b.quantity - s.quantity), b.quantity) AS quantity, |
| 56 | + COALESCE(SUM(b.costBasis - s.costBasis), b.costBasis) AS total |
| 57 | + FROM buy b |
| 58 | + LEFT JOIN sell s USING(username, symbol, name, c_id, cash) |
| 59 | + GROUP BY 1, 2, 3, 4, 5 |
| 60 | + ORDER BY name |
| 61 | + ) |
| 62 | +SELECT * FROM results WHERE quantity >0; |
0 commit comments