如何在同一个表的两个不同列中执行聚合并加入mysql?

时间:2021-05-30 21:18:45

标签: mysql

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 字段来查找数量总和:

  • 唯一的buyer_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 |
+-------+--------+--------+
  • 按seller_broker 分组并将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 |
+-------+--------+-------+

但我希望这些结果显示在同一张表上。它们有 scripBROKER 作为公共字段。所以新表应该是这样的:

+-------+--------+--------+----------+
| scrip | BROKER | BOUGHT |   SOLD   |    
+-------+--------+--------+----------+

此外:

  • 如果经纪商只买入而不卖出,它仍应显示在新表中,值为 SOLD0
  • 我不想创建一个中间表并加入它们来实现这一点。

我为实现这一目标而失败的尝试之一是:

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

1 个答案:

答案 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

相关问题