2017-03-01 61 views
0

我正在为我的大学的一个项目工作,而且它非常重要,我明白了。我认为我有它的工作原理,但是我必须在过去的几天里学习SQL才能做到这一点,我想在这里发布它来仔细检查所有比我更了解SQL的人。对于一组ID在另一列中挑出不同的ID并计数

这里是一个小例子来测试

index  BorrowerID CompanyID PackageID 
---------- ---------- ---------- ---------- 
0   1   100   10   
1   1   200   10   
2   2   300   20   
3   2   300   20   
4   2   400   20   
5   2   100   20   
6   3   400   30   
7   3   100   30   
8   3   200   30   
9   1   100   40 

目标:

我们想知道的次公司贷款借款人的数量。在银团贷款中,可能会在一个包裹中存在多笔贷款,因此每个包裹只计算一次。公司可能向同一借款人出借多个包裹,这些都需要增加计数。理想情况下,我们会有一个数据集,其中有借款人与公司有关系,定义为至少从一个公司获得一笔贷款。以下是测试结果:

BorrowerID CompanyID testResults 
---------- ---------- ----------- 
1   100   2   
1   200   1   
2   100   1   
2   300   1   
2   400   1   
3   100   1   
3   200   1   
3   400   1 

借款人ID 1从银行100两次不同时间借入。一旦进入包装10,然后再进入包装40.结果显示2为正确的计数。所有其他人都是正确的,因为他们只与银行有一种关系。

这是我已经运行到完成这个查询:

.open testdb.db 
.mode column 
.headers on 
select * from testdb; 

drop table if exists innerQ; 

create table innerQ 
AS select PackageID, BorrowerID, CompanyID, count(*) as c 
from testdb 
group by PackageID, CompanyID 
order by PackageID asc; 

.print 
.print 'inner query' 
select * from innerQ; 

.print 
.print 'test' 
select BorrowerID, CompanyID, count(*) as testResults 
from innerQ 
group by BorrowerID, CompanyID 
order by BorrowerID asc; 

我真的很想知道,如果我让这对整个数据集,其构造方式与测试相同的松动,将它做正确的事情?我想知道它是否会让我失望,因为在我的简单测试中,以及我运行它的多个其他人已经正确地通过了所有测试,但是我的研究小组中的其他人有一些不同的结果,我强烈怀疑是错误的,但不是100%确定的。我将不胜感激,如果你们都能权衡

回答

1

documentation说:

在任何聚合函数只有一个参数,该参数可以通过关键字DISTINCT之前。在这种情况下,重复元素在被传递到聚合函数之前被过滤。例如,函数“count(distinct X)”将返回列X的不同值的数量,而不是列X中的非空值的总数。

所以,您可以直接使用单个查询:

SELECT BorrowerID, 
     CompanyID, 
     count(DISTINCT PackageID) AS testResults 
FROM testdb 
GROUP BY BorrowerID, 
     CompanyID 
ORDER BY BorrowerID, 
     CompanyID; 
+0

这真棒,我验证你的解决方案的作品。我认为我会重构我的代码来实现你的方式。 – debo

相关问题