2013-08-18 91 views
0

我有如下表:SQL SELECT语句(SQLite的)

$ sqlite3 :memory: 
BEGIN TRANSACTION; 
CREATE TABLE trades (date, stock, buyer, seller, quantity); 
INSERT INTO "trades" VALUES(1,'X','A','B',10); 
INSERT INTO "trades" VALUES(1,'X','A','C',10); 
INSERT INTO "trades" VALUES(1,'Y','C','A',20); 
INSERT INTO "trades" VALUES(2,'X','B','A',10); 
INSERT INTO "trades" VALUES(2,'Y','B','A',10); 
INSERT INTO "trades" VALUES(2,'Z','D','E',11); 
COMMIT; 

select * from trades; 
date  stock  buyer  seller  quantity 
---------- ---------- ---------- ---------- ---------- 
1   X   A   B   10   
1   X   A   C   10   
1   Y   C   A   20   
2   X   B   A   10   
2   Y   B   A   10   
2   Z   D   E   11   

我希望做的每一天,每一个股票的摘要,包括买入和卖出股票的总金额为每个经纪人,即每个股票和每一天的每个经纪人的汇总活动。我找的输出是这样的:

select ...magic statement ... from trades; 
date  stock  broker  bought  sold 
---------- ---------- ---------- ---------- ---------- 
1   X   A   20   0 
1   X   B   0   10 
1   X   C   0   10 
1   Y   A   0   20 
1   Y   B   0   0 
1   Y   C   20   0 
2   X   A   0   10 
2   X   B   10   0 
2   X   C   0   0 
2   Y   A   0   10 
2   Y   B   10   0 
2   Y   C   0   0 

股和券商名称的列表是不固定的,即它们必须从表本身检索(因此不能“硬编码”中的SQL SELECT声明)。

这是可能在一个单一的(SQLite)SQL语句?

回答

1

我有点像使用两个子查询和一个工会作弊,但在这里你走了。

SELECT date, stock, broker, SUM(bought) bought, SUM(sold) sold FROM (
    SELECT date, stock, buyer broker, SUM(quantity) bought, 0 sold FROM trades GROUP BY date, stock, buyer 
    UNION 
    SELECT date, stock, seller broker, 0 as bought, SUM(quantity) FROM trades GROUP BY date, stock, seller 
) GROUP BY date, stock, broker; 

结果:

date  stock  broker  bought  sold  
---------- ---------- ---------- ---------- ---------- 
1   X   A   20   0   
1   X   B   0   10   
1   X   C   0   10   
1   Y   A   0   20   
1   Y   C   20   0   
2   X   A   0   10   
2   X   B   10   0   
2   Y   A   0   10   
2   Y   B   10   0   
2   Z   D   11   0   
2   Z   E   0   11  

编辑:我刚刚看到您要列出真是应有尽有含。所有日子里的所有经纪人,即使他们没有在任何股票上进行任何交易。 因此,这里是全摘要:

SELECT date, stock, broker, SUM(bought) bought, SUM(sold) sold FROM (
    SELECT date, stock, buyer broker, SUM(quantity) bought, 0 sold FROM trades GROUP BY date, stock, buyer 
    UNION 
    SELECT date, stock, seller broker, 0 as bought, SUM(quantity) FROM trades GROUP BY date, stock, seller 
    UNION 
    SELECT DISTINCT d.date, s.stock, b.broker, 0 bought, 0 sold FROM (SELECT DISTINCT date FROM trades) d, (SELECT DISTINCT stock FROM trades) s, (SELECT DISTINCT seller broker FROM trades UNION SELECT DISTINCT buyer broker FROM trades) b 
) GROUP BY date, stock, broker; 

结果:

date  stock  broker  bought  sold  
---------- ---------- ---------- ---------- ---------- 
1   X   A   20   0   
1   X   B   0   10   
1   X   C   0   10   
1   X   D   0   0   
1   X   E   0   0   
1   Y   A   0   20   
1   Y   B   0   0   
1   Y   C   20   0   
1   Y   D   0   0   
1   Y   E   0   0   
1   Z   A   0   0   
1   Z   B   0   0   
1   Z   C   0   0   
1   Z   D   0   0   
1   Z   E   0   0   
2   X   A   0   10   
2   X   B   10   0   
2   X   C   0   0   
2   X   D   0   0   
2   X   E   0   0   
2   Y   A   0   10   
2   Y   B   10   0   
2   Y   C   0   0   
2   Y   D   0   0   
2   Y   E   0   0   
2   Z   A   0   0   
2   Z   B   0   0   
2   Z   C   0   0   
2   Z   D   11   0   
2   Z   E   0   11  

让我们看一下查询:

SELECT date, stock, buyer broker, SUM(quantity) bought, 0 sold 
FROM trades 
GROUP BY date, stock, buyer 

仅列出(按组),每购买的总和日期,股票的买家。我们还需要有一个已售出的专栏,以便UNION可以正常工作,因此只需使用恒定值0即可。与销售工作一样。

SELECT DISTINCT d.date, s.stock, b.broker, 0 bought, 0 sold 
FROM 
(SELECT DISTINCT date FROM trades) d, 
(SELECT DISTINCT stock FROM trades) s, 
(SELECT DISTINCT seller broker FROM trades 
    UNION SELECT DISTINCT buyer broker FROM trades) b 

这一个是讨厌的。它将加入(在子查询中选择)所有日期,股票和经纪人,并将其分配为不买和不卖。这只是为了得到整个表,即这些行只是填充。

SELECT date, stock, broker, SUM(bought) bought, SUM(sold) sold 
FROM (...) 
GROUP BY date, stock, broker; 

子查询会产生很多行。此顶级查询只是汇总数据。

0

我认为你可以添加一些列到你当前的表中,计算总结并填写它们每一天。然后你可以使用SELECT语句。