2013-08-18 3 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   

내가 즉, 각 브로커에 대한 구입 및 판매 주식의 총량을 포함, 매일 각 주식에 대한 요약을하고자을 각 주식 및 매일의 각 브로커에 대한 집계 된 활동 그들이 선택한 SQL에서 "하드"가 될 수 없습니다, 따라서 테이블 자체에서 검색 (그리고해야 즉, 주식 및 브로커 이름의 목록이 고정되어 있지

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 

: 내가 찾고 있어요 출력은 다음과 같은 것입니다 성명서).

단일 (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, buyer broker, SUM(quantity) bought, 0 sold 
FROM trades 
GROUP BY date, stock, buyer 

목록을 (기준 그룹) 당 구매의 합을 날짜 :

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  

이의이 쿼리를 살펴 보자 그래서 여기에 전체 요약 주식, 구매자. 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 문을 사용할 수 있습니다.