对于一组ID,在另一列中选择不同的ID并计算

时间:2017-03-01 06:27:11

标签: sql sqlite

我正在我的大学从事一个项目,这非常重要。我想我有它的工作,但我必须在最近几天学习SQL才能做到这一点,并且我想在这里发布它,以便仔细检查所有比我更了解SQL的人。

这是一个测试

的小例子
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 

BorrowerID 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 个答案:

答案 0 :(得分: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;