从 JOINED 表中获取合计数量

Get aggregate quantity from JOINED tables

我的数据库中有以下两个 table

inventory_transactions table

    
  id |        date_created        | company_id | product_id | quantity | amount | is_verified | buy_or_sell_to | transaction_type | parent_tx | invoice_id | order_id | transaction_comment
----+----------------------------+------------+------------+----------+--------+-------------+----------------+------------------+-----------+------------+----------+---------------------
  1 | 2022-04-25 10:42:00.627495 |         20 |        100 |       23 |   7659 | t           |                | BUY              |           |          1 |          |
  2 | 2022-04-25 10:48:48.02342  |         21 |          2 |       10 |    100 | t           |                | BUY              |           |          2 |          |
  3 | 2022-04-25 11:00:11.624176 |         21 |          7 |       10 |    100 | t           |                | BUY              |           |          3 |          |
  4 | 2022-04-25 11:08:14.607117 |         23 |          1 |       11 |   1210 | t           |                | BUY              |           |          4 |          |
  5 | 2022-04-25 11:13:24.084845 |         23 |         28 |       16 |   2560 | t           |                | BUY              |           |          5 |          |
  6 | 2022-04-25 11:26:56.338881 |         23 |         28 |       15 |   3525 | t           |              5 | BUY              |           |          6 |        1 |
  7 | 2022-04-25 11:26:56.340112 |          5 |         28 |       15 |   3525 | t           |             23 | SELL             |         6 |          6 |        1 |
  8 | 2022-04-25 11:30:08.529288 |         23 |         30 |       65 |  15925 | t           |              5 | BUY              |           |          7 |        2 |
  9 | 2022-04-25 11:30:08.531005 |          5 |         30 |       65 |  15925 | t           |             23 | SELL             |         8 |          7 |        2 |
 14 | 2022-04-25 12:28:51.658902 |         23 |         28 |      235 |  55225 | t           |              5 | BUY              |           |         11 |        5 |
 15 | 2022-04-25 12:28:51.660478 |          5 |         28 |      235 |  55225 | t           |             23 | SELL             |        14 |         11 |        5 |
 20 | 2022-04-25 13:01:31.091524 |         20 |          4 |        4 |    176 | t           |                | BUY              |           |         15 |          |
 10 | 2022-04-25 11:50:48.4519   |         21 |         38 |        1 |     10 | t           |                | BUY              |           |          8 |          |
 11 | 2022-04-25 11:50:48.454118 |         21 |         36 |        1 |     10 | t           |                | BUY              |           |          8 |          |
 12 | 2022-04-25 11:52:19.827671 |         21 |         29 |        1 |     10 | t           |                | BUY              |           |          9 |          |
 13 | 2022-04-25 11:53:16.699881 |         21 |         74 |        1 |     10 | t           |                | BUY              |           |         10 |          |
 16 | 2022-04-25 12:37:39.739125 |         20 |          1 |      228 |  58824 | t           |                | BUY              |           |         12 |          |
 17 | 2022-04-25 12:37:39.741106 |         20 |          3 |      228 |  58824 | t           |                | BUY              |           |         12 |          |
 18 | 2022-04-25 12:49:09.922686 |         21 |         41 |       10 |   1000 | t           |                | BUY              |           |         13 |          |
 19 | 2022-04-25 12:55:11.986451 |         20 |          5 |       22 |    484 | t           |                | BUY              |           |         14 |          |

注意 inventory_transactions table 中的每笔交易都记录了两次,其中 company_idbuy_or_sell_to 交换了第二次行和 transaction_type 买入或卖出保留。 (类似于会计中日记帐的处理方式)。

 db# select * from inventory_transactions where buy_or_sell_to is not Null order by date_created limit 50;
 id |        date_created        | company_id | product_id | quantity | amount | is_verified | buy_or_sell_to | transaction_type | parent_tx | invoice_id | order_id | transaction_comment
----+----------------------------+------------+------------+----------+--------+-------------+----------------+------------------+-----------+------------+----------+---------------------
  6 | 2022-04-25 11:26:56.338881 |         23 |         28 |       15 |   3525 | t           |              5 | BUY              |           |          6 |        1 |
  7 | 2022-04-25 11:26:56.340112 |          5 |         28 |       15 |   3525 | t           |             23 | SELL             |         6 |          6 |        1 |
  8 | 2022-04-25 11:30:08.529288 |         23 |         30 |       65 |  15925 | t           |              5 | BUY              |           |          7 |        2 |
  9 | 2022-04-25 11:30:08.531005 |          5 |         30 |       65 |  15925 | t           |             23 | SELL             |         8 |          7 |        2 |

companies table(将此视为用户 table,在我的项目中所有用户都是公司)

 id | company_type |      gstin      |    name     |  phone_no  | address | pincode | is_hymbee_verified | is_active | district_id | pancard_no
----+--------------+-----------------+-------------+------------+---------+---------+--------------------+-----------+-------------+------------
 26 | RETAILER     | XXXXXXXXXXXXXXX | ACD LLC     | 12345%7898 | AQWSAQW | 319401  |                    |           |          11 | AQWSDERFVV  
 27 | DISTRIBUTOR  | XXXXXXXXXXXXXXX | CDF LLC     | 123XX7898  | AGWSAQW | 319201  |                    |           |          13 | AQWSDERFVV  
 28 | RETAILER     | XXXXXXXXXXXXXXX | !@# LLC     | 1234!67XX9 | AQCCAQW | 319101  |                    |           |          16 | AQWSDERFVV  
 29 | COMPANY      | XXXXXXXXXXXXXXX | ZAZ LLC     | 123456S898 | AQWQQQW | 319001  |                    |           |          19 | AQWSDERFVV  

问题陈述

我尝试编写的查询将获取仅售给 RETAILER 用户和 DISTRIBUTORS 用户 RETAILER 或 [=23= 用户的数量].

例如,如果一个用户是 RETAILER,我们需要计算这个 RETAILER 已经卖给其他 RETAILER 或 [=23= 的用户的数量]s.

换句话说,对于 companies table 中的所有行,检查 company 是否属于 company_typeRETAILERDISTRIBUTOR 并从 inventory_transactions table,检查 quantity 一个 partiuclar RETAILERDISTRIBUTOR 卖给其他 RETAILER 和 [=23] 的数量=]s

我对 SQL 有非常基本的了解,目前只了解了:

select Seller.id as Seller_ROW, Buyer.id as Buyer_row, Seller.company_id, Buyer.buy_or_sell_to, Seller.company_type as Seller_Type, Buyer.company_type as Buyer_Type, Seller.quantity, Buyer.quantity
FROM 
(select t.id, t.company_id, t.quantity, c.company_type
from inventory_transactions as t
join companies as c on c.id = t.company_id
where c.company_type = 'RETAILER' or company_type = 'DISTRIBUTOR'
) as Seller
JOIN
(select t.id, t.buy_or_sell_to, t.quantity, c.company_type
from inventory_transactions as t
join companies as c on c.id = t.buy_or_sell_to
where c.company_type = 'RETAILER' or company_type = 'DISTRIBUTOR') as Buyer on Seller.id = Buyer.id

产出

 seller_row | buyer_row | company_id | buy_or_sell_to | seller_type | buyer_type  | quantity | quantity
------------+-----------+------------+----------------+-------------+-------------+----------+----------
         25 |        25 |         22 |             25 | RETAILER    | DISTRIBUTOR |        1 |        1
         26 |        26 |         25 |             22 | DISTRIBUTOR | RETAILER    |        1 |        1
         31 |        31 |         37 |             43 | DISTRIBUTOR | RETAILER    |       10 |       10
         32 |        32 |         43 |             37 | RETAILER    | DISTRIBUTOR |       10 |       10
         33 |        33 |         21 |             43 | DISTRIBUTOR | RETAILER    |        1 |        1
         34 |        34 |         43 |             21 | RETAILER    | DISTRIBUTOR |        1 |        1
         35 |        35 |         21 |             49 | DISTRIBUTOR | RETAILER    |        1 |        1
         36 |        36 |         49 |             21 | RETAILER    | DISTRIBUTOR |        1 |        1
         37 |        37 |         21 |             51 | DISTRIBUTOR | RETAILER    |        1 |        1
         38 |        38 |         51 |             21 | RETAILER    | DISTRIBUTOR |        1 |        1

结果 table 中有重复的行,所以我无法执行 SUM()

预期结果

SELLER.company_id   |   SELLER.company_name     |   SELLER.company_type     |   QUANTITY    | BUYER.company_type
    26              |   XYZ Retail Co.          |            RETAILER       |   14          |   RETAILER
    26              |   XYZ Retail Co.          |            RETAILER       |   1           |   DISTRIBUTOR
    27              |   ACD Distributions       |            DISTRIBUTOR    |   0           |   RETAILER
    27              |   ACD Distributions       |            DISTRIBUTOR    |   10          |   DISTRIBUTOR

此答案假设每个销售都表示为 inventory_transactions 中的两行,这样可以通过仅使用一个 transaction_type 来避免重复,因此我们将过滤 [=13] =] 交易。

SELECT t.company_id AS seller_company_id
, s.company_name AS seller_company_name
, s.company_type AS seller_company_type
, SUM(t.quantity) AS quantity
, b.company_type AS buyer_company_type
FROM inventory_transactions AS t
INNER JOIN companies AS s
ON s.id = t.company_id
INNER JOIN companies AS b
ON b.id = buy_or_sell_to
WHERE t.transaction_type = 'SELL'
AND s.company_type IN ('RETAILER','DISTRIBUTOR')
AND b.company_type IN ('RETAILER','DISTRIBUTOR')
GROUP BY t.company_id, s.company_name, s.company_type, b.company_type
ORDER BY seller_company_id, seller_company_name, seller_company_type, buyer_company_type
;