我在这件事上挣扎了一段时间,似乎想不通了.

我有一个客户、关系(定义客户之间的关系及其类型)和咨询. 我不想计算的是,为合作伙伴提供了多少次新类型的咨询.问题是,可能会发生这样的情况:两个客户都有一个‘New’类型的咨询,但我只想数一个,因为我只对我在咨询中有多少个合作伙伴感兴趣.

以下是我的数据库的简化SQL

CREATE TABLE clients (
  id INT NOT NULL,
  name VARCHAR NOT NULL,
  PRIMARY KEY(id)
);

CREATE TABLE relations (
  id INT NOT NULL,
  from_client_id INT NOT NULL,
  to_client_id INT NOT NULL,
  relation_type VARCHAR NOT NULL,
  PRIMARY KEY(id)
);

CREATE TABLE consultations (
  id INT NOT NULL,
  client_id INT NOT NULL,
  type_of VARCHAR NOT NULL,
  PRIMARY KEY(id)
);

一些种子数据

insert into clients (id, name)
VALUES
(1, 'John Doe'),
(2, 'Jane Doe'),
(3, 'Fiddle Blaab'), 
(4, 'Agnes Blaab'),
(5, 'Kid Blaab')

insert into relations (id, from_client_id, to_client_id, relation_type)
VALUES
(1, 1, 2, 'partner'),
(2, 3, 4, 'partner'),
(3, 3, 5, 'child'),
(4, 4, 5, 'child')

insert into consultations (id, client_id, type_of)
VALUES
(1, 1, 'New'),
(2, 2, 'New'),
(3, 2, 'Follow Up'),
(4, 3, 'New'),
(5, 4, 'Follow Up')

像这样 Select 数据会得到3,但在本例中我只希望得到2.

SELECT 
count(*)
FROM consultations
INNER JOIN clients ON consultations.client_id = clients.id 
  AND "consultations"."type_of" = 'New'
INNER JOIN relations ON (relations.from_client_id = consultations.client_id OR relations.to_client_id = consultations.client_id)
  AND relations.relation_type = 'partner'

这是因为无名氏John Doe和无名氏Jane Doe的咨询类型都是"new",但在本例中,我只想计算一次咨询,因为我只对咨询中有多少名合伙人感兴趣,在咨询中,这个 Select 将我和Jane和John都算作合伙人.

所以我的预期结果是无名氏和无名氏是1,菲德尔·布莱布和阿格尼丝·布莱布是第二.

我希望这对我正在努力实现的目标有意义.

我创造了一个db fiddle

推荐答案

select count(distinct r.id) from
(select id,from_client_id client_id from relations where relation_type='partner'
  union all
select id,to_client_id client_id from relations where relation_type='partner')r
inner join consultations c on r.client_id=c.client_id and c.type_of = 'New'
count
2

fiddle

Sql相关问答推荐

创建每小时重置的序列号

PG SQL中按条件聚合值

判断Pyspark生成的SQL查询

如何在case语句中使用条件来计算成对变量

SQL—如何在搜索的元素之后和之前获取元素?

如何使用WSO2将空值传递给我的SQL Server存储过程?

SQL基于多个值 Select 单行

在数据库中搜索列

你能过滤一个列表只返回多个结果吗?

在查询Oracle SQL中创建替代ID

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

SQL根据另一列的顺序和值获取组中的最后一列

Postgresql 生成器列导致语法错误

在 SQL Server 中查找重复项

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

Clickhouse:左连接表到外部数组

为数组中的每个元素从表中收集最大整数

如何在 RavenDB Studio (RQL) 中插入更新文档

snowfalke 会在 Select 运行时锁定表吗?

SQL/Postgres:按日期和其他属性对相关性能进行分组