2015-12-02 40 views
1

在給定的表中,有2個重要字段。一個字段是字段的外鍵,在這種情況下,userID是另一個狀態字段。數據類型並不重要,但爲了簡單起見,兩者都是整數。狀態字段具有有限數量的輸出,爲了簡單起見,也是0或1.這個外鍵當然可以是任何合理的整數。sql通過X獲得組中沒有特定Y值的X的計數,Y

下面的查詢將有每個用戶ID最多2行,共行的數量與每個狀態

SELECT userID, Status, count(Status) as total FROM tbl Group by userID, Status 

如果上一個示例表運行,它會看起來像

userID Status total 
1   0  5 
1   1  2 
2   1  2 
4   0  6 

對於這個虛表,這意味着ID爲1的用戶在該表中有7行,其中5個狀態爲0,而另外2個狀態爲1.用戶ID 2只有2行狀態1,用戶ID 3在該表中沒有行,並且4具有狀態0的6個。

怎麼能夠進一步細化這一點,以便只返回與0狀態行,但只有當用戶ID沒有與狀態1.任何行。在上述情況下,只返回行會

userID Status total 
4   0  6 
+0

我討厭期待我們從結果推斷源數據集的問題。我既不是心靈也不是特別聰明,所以我認爲它是優秀的。 – Strawberry

+0

@Strawberry爲什麼當我要求在方程x + y = 2中求解x時,人們問我什麼是y。正如接受的答案所示,有一種方法可以在不知道y的情況下解決這個問題,就像你可以在不知道代數中的y的情況下求解x一樣。並非每個事實都需要回答一個問題。這個問題是一個概念性的問題,這個概念很重要,它的用途不是。 – Ryan

回答

1

使用條件COUNT來計算組中有多少個1。

Sql Fiddle Demo

SELECT u.userID, u.Status, count(u.Status) as total 
FROM users u 
JOIN (SELECT userID 
     FROM users 
     GROUP BY userID 
     HAVING COUNT(CASE WHEN Status = 1 THEN 1 
         ELSE NULL 
        END) = 0 
    ) f -- filter 
    ON u.userID = f.userID 
GROUP BY userID, Status; 

else null是可選的更好看了,但可以刪除

輸出

| userID | Status | total | 
|--------|--------|-------| 
|  4 |  0 |  6 | 

SUM也行。

HAVING SUM(case when status = 1 then 1 else 0 END) = 0 
+0

這可以在刪除狀態爲1的所有行時有效,但在userID具有狀態爲1的行時不能爲狀態爲0的那些行。 它會返回第一個示例表中的頂部和底部行 – Ryan

+1

請檢查我的編輯。 –

+0

由喬治他完成了它 – Ryan

相關問題