2017-07-05 14 views
0

我有客户和应用程序表。我想创建选择查询,它提供有关客户的信息,并计算用户在系统中的数量。如何粘合两个依赖表?

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; 

,但我得到我需要按地区和城市的错误,但我想显示有关每个应用程序的信息不按地区和城市。因为通过这种方式,我不会为每个用户获得大量的应用程序,而是会为每个用户群获取大量的应用程序。 我读过,它可以做嵌套查询和完整的外连接,但我试过了,它不起作用。你能向我解释怎么做?

回答

1

你就近了。

  1. 使用LEFT OUTER JOIN使Customers 0记录Applications也将被纳入(假设你在这里的意图)

  2. 不要使用DISTINCTGROUP BY在一起。不同的意思是“如果所有字段在由此SELECT语句生成的记录集中的多个记录中都是相同的值,那么只返回不同的记录,删除重复记录”。取而代之的是GROUP BY,“按这个字段列表分组,所有不在此列表中的其他字段将使用SELECT子句中的公式聚合,如count(a.customer_id_id)。”它们是相似的,但你不能仅仅用一个DISTINCT来聚合一个字段。

  3. 当使用GROUP BY,如果你不打算聚集现场与聚合配方(countsumavg,等..),那么你必须将它包括在群分析研究。对于某些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; 
0

不知道你的问题是什么。我假设区域和城市在功能上依赖于id(即id是候选键)。较新版本的postgresql将会接受你的查询。不过,如果你使用的是旧版本,你可以通过条款扩大您的团队:

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;