DB 包含一个名为 floorsheet_table
的表,其中包含如下数据:
+-------+--------------+---------------+----------+
| scrip | buyer_broker | seller_broker | quantity |
+-------+--------------+---------------+----------+
| AKPL | 1 | 34 | 80 |
| AKPL | 1 | 1 | 100 |
| AKPL | 34| 56 | 1000 |
| AKPL | 1 | 40 | 200 |
| AKPL | 1 | 35 | 50 |
| AKPL | 1 | 52 | 50 |
| AKPL | 52 | 56 | 120 |
| AKPL | 1 | 56 | 140 |
| AKPL | 17 | 56 | 100 |
| AKPL | 41 | 56 | 100 |
+-------+--------------+---------------+----------+
我想通过汇总buyer_broker 和seller_broker 字段来查找数量总和:
SUM(quantity)
字段命名为“BOUGHT”。示例:SELECT scrip, buyer_broker AS 'BROKER', SUM(quantity) AS 'BOUGHT' FROM floorsheet_table GROUP BY scrip, buyer_broker;
+-------+--------+--------+
| scrip | BROKER | BOUGHT |
+-------+--------+--------+
| AKPL | 1 | 21533 |
| AKPL | 17 | 11540 |
| AKPL | 41 | 31103 |
| AKPL | 49 | 43826 |
| AKPL | 45 | 44402 |
| AKPL | 54 | 16685 |
| AKPL | 6 | 12609 |
| AKPL | 4 | 7220 |
| AKPL | 38 | 13824 |
| AKPL | 21 | 20214 |
+-------+--------+--------+
SUM(quantity)
字段命名为“SOLD”。示例:SELECT scrip, seller_broker AS 'BROKER', SUM(quantity) AS 'SOLD' FROM floorsheet_table GROUP BY scrip, seller_broker;
+-------+--------+-------+
| scrip | BROKER | SOLD |
+-------+--------+-------+
| AKPL | 4 | 59762 |
| AKPL | 16 | 46460 |
| AKPL | 58 | 40658 |
| AKPL | 45 | 38380 |
| AKPL | 49 | 35361 |
| AKPL | 38 | 34227 |
| AKPL | 44 | 33393 |
| AKPL | 59 | 32817 |
| AKPL | 56 | 31125 |
| AKPL | 35 | 30368 |
+-------+--------+-------+
但我希望这些结果显示在同一张表上。它们有 scrip
和 BROKER
作为公共字段。所以新表应该是这样的:
+-------+--------+--------+----------+
| scrip | BROKER | BOUGHT | SOLD |
+-------+--------+--------+----------+
此外:
SOLD
为 0
。我为实现这一目标而失败的尝试之一是:
SELECT b.scrip AS 'SCRIP', b.buyer_broker AS 'BROKER', b.BOUGHT as 'BOUGHT', s.SOLD as 'SOLD' FROM
SELECT scrip, buyer_broker as 'BROKER', SUM(quantity) AS 'BOUGHT' FROM floorsheet_table AS b GROUP BY b.scrip, b.buyer_broker INNER JOIN
SELECT scrip, seller_broker as 'BROKER', SUM(quantity) AS 'SOLD' FROM floorsheet_table AS s GROUP BY scrip, seller_broker ON b.buyer_broker=s.seller_broker;
此引发的错误:
SELECT is not valid at this position for this server version, expecting '(', WITH
答案 0 :(得分:3)
为此,您需要一个 Mysql 没有的 FULL OUTER JOIN。
在大桌子上这有点慢
<块引用>CREATE TABLE floorsheet_table (
`scrip` VARCHAR(4),
`buyer_broker` INTEGER,
`seller_broker` INTEGER,
`quantity` INTEGER
);
INSERT INTO floorsheet_table
(`scrip`, `buyer_broker`, `seller_broker`, `quantity`)
VALUES
('AKPL', '1', '34', '80'),
('AKPL', '1', '1', '100'),
('AKPL', '34', '56', '1000'),
('AKPL', '1', '40', '200'),
('AKPL', '1', '35', '50'),
('AKPL', '1', '52', '50'),
('AKPL', '52', '56', '120'),
('AKPL', '1', '56', '140'),
('AKPL', '17', '56', '100'),
('AKPL', '41', '56', '100');
<块引用>
SELECT buy1.`scrip`,buy1.`BROKER`,`BOUGHT`,`SOLD`
FROM
(SELECT scrip, buyer_broker AS 'BROKER', SUM(quantity) AS 'BOUGHT' FROM floorsheet_table GROUP BY scrip, buyer_broker) buy1
LEFT JOIN (SELECT scrip, seller_broker AS 'BROKER', SUM(quantity) AS 'SOLD' FROM floorsheet_table GROUP BY scrip, seller_broker) sell1
ON buy1.`scrip` = sell1.`scrip` AND buy1.`BROKER` = sell1.`BROKER`
UNION
SELECT sell2.`scrip`,sell2.`BROKER`,`BOUGHT`,`SOLD`
FROM
(SELECT scrip, buyer_broker AS 'BROKER', SUM(quantity) AS 'BOUGHT' FROM floorsheet_table GROUP BY scrip, buyer_broker) buy2
RIGHT JOIN (SELECT scrip, seller_broker AS 'BROKER', SUM(quantity) AS 'SOLD' FROM floorsheet_table GROUP BY scrip, seller_broker) sell2
ON buy2.`scrip` = sell2.`scrip` AND buy2.`BROKER` = sell2.`BROKER`
<块引用>
scrip | BROKER | BOUGHT | SOLD :---- | -----: | -----: | ---: AKPL | 1 | 620 | 100 AKPL | 34 | 1000 | 80 AKPL | 52 | 120 | 50 AKPL | 17 | 100 | null AKPL | 41 | 100 | null AKPL | 56 | null | 1460 AKPL | 40 | null | 200 AKPL | 35 | null | 50
db<>fiddle here