簡體   English   中英

在 SQL 服務器中使用 Distinct 獲取計數

[英]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。

db<>小提琴

回復 逾期 全部的
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM