Sql Postgres连接并计数多个关系表

Sql Postgres连接并计数多个关系表,sql,postgresql,Sql,Postgresql,我想将这两个表连接到第一个表,并按供应商名称分组。我有下面列出的三张表 供应商表 | id | name |:-----------|------------:| | test-id | Vendor Name | | id | VendorId | Details | isActive(Boolean)| price | |:-----------|------------:|:------------:| -----

我想将这两个表连接到第一个表,并按供应商名称分组。我有下面列出的三张表

供应商表

| id         |      name 
|:-----------|------------:|
| test-id    | Vendor Name |    
| id         | VendorId    | Details      | isActive(Boolean)| price |
|:-----------|------------:|:------------:| -----------------| --------
| random-id  |   test-id   |  Sample test |   TRUE            | 5000
| id         | VendorOrderId| Details.   |
|:-----------|--------------:-----------:|
| order-id   |   random-id  | Sample test|   
供应商订单表

| id         |      name 
|:-----------|------------:|
| test-id    | Vendor Name |    
| id         | VendorId    | Details      | isActive(Boolean)| price |
|:-----------|------------:|:------------:| -----------------| --------
| random-id  |   test-id   |  Sample test |   TRUE            | 5000
| id         | VendorOrderId| Details.   |
|:-----------|--------------:-----------:|
| order-id   |   random-id  | Sample test|   
OrdersIssues表

| id         |      name 
|:-----------|------------:|
| test-id    | Vendor Name |    
| id         | VendorId    | Details      | isActive(Boolean)| price |
|:-----------|------------:|:------------:| -----------------| --------
| random-id  |   test-id   |  Sample test |   TRUE            | 5000
| id         | VendorOrderId| Details.   |
|:-----------|--------------:-----------:|
| order-id   |   random-id  | Sample test|   
预期的输出是计算有多少订单属于供应商,有多少问题属于供应商订单

我有下面的代码,但它没有给出正确的输出

SELECT "vendors"."name" as "vendorName", 
COUNT("vendorOrders".id) as allOrders,
COUNT("orderIssues".id) as allIssues 
FROM "vendors" 
LEFT OUTER JOIN "vendorOrders" ON "vendors".id = "vendorOrders"."vendorId" 
LEFT OUTER JOIN "orderIssues" ON "orderIssues"."vendorOrderId" = "vendorOrders"."id"
GROUP BY "vendors".id;```


您需要关键字
DISTINCT
,至少对于
allOrders

SELECT v.name vendorName, 
       COUNT(DISTINCT vo.id) allOrders,
       COUNT(DISTINCT oi.id) allIssues 
FROM vendors v
LEFT OUTER JOIN vendorOrders vo ON v.id = vo.vendorId 
LEFT OUTER JOIN orderIssues oi ON oi.vendorOrderId = vo.id
GROUP BY v.id, v.name;

考虑使用别名而不是完整的表名,以使代码更短、更具可读性。

您将沿着两个相关的维度进行连接。总行数是问题数。但要获得订单数量,您需要一个不同的计数:

SELECT v.*, count(distinct vo.id) as num_orders,
       COUNT(oi.vendororderid) as num_issues
FROM vendors v LEFT JOIN
     vendorOrders vo
     ON v.id = vo.vendorId LEFT JOIN
     orderIssues oi
     ON oi.vendorOrderId = vo.id
GROUP BY v.id;
注:

  • 表别名使查询更易于编写和读取
  • 引用列名和表名会使查询更难编写和读取。不要引用标识符(您可能需要重新创建表)
  • Postgres支持
    选择v.*。按v.id
    分组,假设
    id
    是主键(实际上,它只需要是唯一的)。这似乎是一个合理的假设

感谢您的回复,您知道如何使用别名“activeOrders”来计算isActive=true的订单吗?@dealwap Try:
count(vo.isActive和vo.id END的不同情况下)activeOrders
。在同一张表上,如果我需要汇总
价格列怎么办?请注意,我不能使用DISTINCT,因为不同的表可能具有相同的值。有什么想法吗?在具有多个联接的查询中,结果可能包含您要求和的价格的重复行。因此,just SUM(price)可能返回错误的结果。发布一个带有样本数据和预期结果的问题,以澄清您的需求。