簡體   English   中英

如何在同一張表的兩個不同列中進行聚合並加入mysql?

[英]How to perform aggregation in two different columns of same table and join in 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 字段來查找數量總和:

  • 唯一的買家經紀人並將SUM(quantity)字段命名為“購買”。 例子:
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

為此,您需要 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`
 腳本 | 經紀人 | 買了| 已售出:---- |  -----: |  -----: |  ---: AKPL |  1 |  620 |  100 AKPL |  34 |  1000 |  80 AKPL |  52 |  120 |  50 AKPL |  17 |  100 |  null AKPL |  41 |  100 |  null AKPL |  56 |  null | 第1460章 40 |  null |  200 AKPL |  35 |  null |  50

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM