2017-03-01 63 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

相關問題