[英]Get count With Distinct in SQL Server
Select
Count(Distinct iif(t.HasReplyTask = 1, t.CustomerID, Null)) As Reply,
Count(Distinct iif(t.HasOverdueTask = 1, t.CustomerID, Null)) As Overdue,
Count(Distinct t.CustomerID) As Total
From
Table1 t
如果客戶在回復中,我們需要在逾期計數中刪除該客戶,這意味着如果客戶 123 在兩者中,則逾期計數應該少一個。 我怎樣才能做到這一點?
我在這里添加一些數據,客戶 123 有“HasReplyTask”,因此,我們必須從 OverDue 中的 Count 中過濾該客戶(即使該客戶有一個沒有 HasReplyTask 的過期任務)。 234 是一,而 456 的 Distinct 是一。 所以,逾期計數應該是 2,上面的查詢返回 3
如果我做對了,這可以使用子查詢來獲取每個客戶的號碼,然后獲取摘要信息,如下所示:
Select Sum(HasReplyTask) As Reply,
Sum(HasOverdueTask) As Overdue,
Count(CustomerID) As Total
From (
Select CustomerID,
IIF(Max(Cast(HasReplyTask As TinyInt))<>0, 0, Max(Cast(HasOverdueTask As TinyInt))) As HasOverdueTask,
Max(Cast(HasReplyTask As TinyInt)) As HasReplyTask
From Table1
Group by CustomerID) As T
我不知道列數據類型,所以我使用強制cast
function 來使用max
function。
回復 | 逾期 | 全部的 |
---|---|---|
1 | 2 | 3 |
將t.HasReplyTask != 1
添加到您的第二個計數中:
Select
Count(Distinct iif(t.HasReplyTask = 1, t.CustomerID, Null)) As Reply,
Count(Distinct iif(t.HasReplyTask != 1 AND t.HasOverdueTask = 1, t.CustomerID, Null)) As Overdue,
Count(Distinct t.CustomerID) As Total
From
Table1 t
對您來說可能更有效的方法是按客戶 ID 預先聚合您的表並計算每個客戶的數量。 然后你的外部查詢可以測試你真正想要的任何東西。 就像是
select
sum( case when PQ.ReplyCount > 0 then 1 else 0 end ) UniqReply,
sum( case when PQ.OverdueCount > 0 then 1 else 0 end ) UniqOverdue,
sum( case when PQ.OverdueCount - PQ.ReplyCount > 0 then 1 else 0 end ) PendingReplies,
count(*) as UniqCustomers
from
( select
yt.customerid,
count(*) CustRecs,
sum( case when yt.HasReplyTask = 1 then 1 else 0 end ) ReplyCount,
sum( case when yt.HasOverdueTask = 1 then 1 else 0 end ) OverdueCount
from
yourTable yt
group by
yt.customerid ) PQ
現在要區分您真正要查找的計數,您可能需要對 ReplyCount 與 OverdueCount 的預查詢 (PQ) 進行測試,例如......對於單個客戶 ID(因此是預查詢),如果 OverdueCount 更大超過ReplyCount,那么還是算過期了? 所以對於客戶 123,他們有 3 個逾期,但只有 2 個回復。 你想算一次嗎? 但對於客戶 234 和 456,只有逾期條目且沒有回復。 因此,逾期 - 回復 > 0 = 3 個不同的人的總數。
那是你的最終目標嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.