我有客户和应用程序表。我想创建选择查询,它提供有关客户的信息,并计算用户在系统中的许多应用程序。
select distinct c.id, c.region, c.city, count(a.customer_id_id)
from customers c
join applications a on c.id=a.customer_id_id
group by c.id;
但是我得到一个错误,我需要按地区和城市进行分组,但我想显示每个应用程序的信息,而不是按地区和城市分组。因为以这种方式,我将为每个用户而不是每个用户组获得许多应用程序。 我读到可以使用嵌套查询和完全外连接,但我尝试过它并没有用。你能告诉我怎么做吗?
答案 0 :(得分:1)
你很亲密。
使用LEFT OUTER JOIN
,以便在Customers
中包含0条记录的Applications
(假设您的意图在这里)
不要同时使用DISTINCT
和GROUP BY
。 Distinct表示“如果所有字段在此SELECT语句生成的记录集中的多个记录中的值相同,则只返回不同的记录,删除重复项”。取而代之的是GROUP BY
,“按此字段列表分组。此列表中未包含的任何剩余字段将使用SELECT子句中的公式进行聚合,如count(a.customer_id_id)
。”它们类似,但您不能仅使用DISTINCT聚合字段。
使用GROUP BY
时,如果您不打算使用聚合公式(count
,sum
,avg
等来汇总字段。)然后你必须把它包含在你的小组中。对于某些RDBMS(例如,旧版本的MySQL)来说,这不是必需的,但是这种做法很糟糕,因为未明确地与GROUP BY
中缺少的公式聚合的字段就像告诉RDBMS“只需从匹配的记录中选择您希望的值,这可能会产生一些意想不到的后果。
SELECT c.id, c.region, c.city, count(a.customer_id_id)
FROM customers c
LEFT OUTER JOIN applications a on c.id=a.customer_id_id
GROUP BY c.id, c.region, c.city;
答案 1 :(得分:0)
不确定您的问题是什么。我假设区域和城市在功能上依赖于id(即id是候选键)。因此,较新版本的postgresql将接受您的查询。但是,如果您使用旧版本,则可以将group by子句扩展为:
select c.id, c.region, c.city, count(a.customer_id_id)
from customers c
join applications a
on c.id=a.customer_id_id
group by c.id, c.region, c.city;
您说您希望显示有关每个应用程序的信息,但为什么要计算每个客户的应用程序数量?你的意思是:
select c.id, c.region, c.city, a.customer_id_id, a.<other attributes>
from customers c
join applications a
on c.id=a.customer_id_id;