2017-09-26 97 views
0

我想小心地提出我想回答的問題,而不是試圖將它提取到流程中的一個步驟,因此請耐心等待我的「流意識「風格。我提取的問題將如標題所示「如何在保留重複行的同時消除三重行(因此無需分組)?」,但我會接受在該流程的任何步驟都可以得到我想要的答案。使用SQL服務器2016.如何在保留重複行的同時消除三重行(SQL Server 2016)

我想在我們的數據庫中找到「零計費電話」。我用的第一個定義是這樣的代碼

SELECT 

    max([Inbound Call Client Account]) as [account] 

     ,convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) as [Date] 

    ,max([Activation Id]) as [Activation Id] 

    FROM [Call_Table] 

    where 

    convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) >= '2017-09-01' 

    and [Chargeable Duration] = 0 

    and ([Inbound Connected Call Duration] IS NULL or [Inbound Connected Call Duration] <1) 

    and [Inbound Call Type] = 'normal operator call' 

    group by [Inbound Call Time] 

基本上任何回答零(或最小)的持續時間的數字呼叫(正常話務員呼叫)。我按入站呼叫時間分組,因爲符合定義的每個呼叫都有兩行,我想在SSRS報告中進行計數,因此每次呼叫只需要一行。

這確定了我想要的呼叫,但它也帶回了我不想要的呼叫。

account Date    Activation Id 
310722 06/09/2017 15CD7A85-084D-4276-BC80-B5369710EC28 
310722 06/09/2017 AA145DE5-A278-4181-8EEF-0AFC4B38F2A8 
310722 06/09/2017 71413B46-CDC8-41A2-AD3D-2CE88B7C851F 
... 
310722 14/09/2017 F36E147A-AC39-4441-9472-225FFD56E013 
310722 14/09/2017 04372920-DDC4-47DC-8D9E-1E807441CDB3 

我知道(從以前的工作),14日的電話是真正的0計費,而6日的電話不是。所以我研究了區別。

SELECT 
     [Inbound Call Client Account] 

     ,[Inbound Call Type] 


     ,[Chargeable Duration] 
     ,[Activation Id] 

     ,[Inbound Call Time] 

    FROM [Call_Table] 

    where [activation id] = '15CD7A85-084D-4276-BC80-B5369710EC28' 

    or [activation id] = 'F36E147A-AC39-4441-9472-225FFD56E013' 

    or [activation id] = 'AA145DE5-A278-4181-8EEF-0AFC4B38F2A8' 

    or [activation id] = '04372920-DDC4-47DC-8D9E-1E807441CDB3' 

    or [activation id] = '71413B46-CDC8-41A2-AD3D-2CE88B7C851F' 

即生成

output

將澄清的區別特徵(我)是的誤報具有相同激活id 3行數據。有沒有辦法將這種區別結合到我的原始查詢中,以便它們不再出現?但是,14日的真正積極行已經重複,所以據我所知,一個組不會工作。

+0

道歉。編輯於。 – tomdemaine

回答

0

我認爲使用HAVING將是最簡單的方法。但爲此,您應該使用GROUP BY此查詢是否有幫助?

SELECT 

    max([Inbound Call Client Account]) as [account] 

     ,convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) as [Date] 

    ,max([Activation Id]) as [Activation Id] 

    FROM [Call_Table] 

    where 

    convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) >= '2017-09-01' 

    and [Chargeable Duration] = 0 

    and ([Inbound Connected Call Duration] IS NULL or [Inbound Connected Call Duration] <1) 

    and [Inbound Call Type] = 'normal operator call' 

    group by [Inbound Call Time],[Activation Id] 
    HAVING Count([Activation Id]) < 3 
+0

消息245,級別16,狀態1,行2 將varchar值「03C51B68-F1AA-4400-944A-2778A4BA6154」轉換爲數據類型爲int時轉換失敗。 – tomdemaine

+0

Soory它應該是 group by [Inbound Call Time],Count([Activation Id]) HAVING Count([Activation Id])<3 –

+0

Msg 144,Level 15,State 1,Line 22 不能使用聚合或用於GROUP BY子句的group by列表的表達式中的子查詢。附:發佈錯誤消息是可以的嗎?不希望遇到有人試圖幫助的粗魯 – tomdemaine

0

您正在尋找的答案是over clause。同樣在未來的發展中,試着讓你列1字例如。 [Inbound Call Client Account]將變成Inbound_Call_Client_Account。這將使得更容易引用列。最底部的查詢會得到所有隻有一式三份的行,從那裏您可以進行任何您喜歡的操作CRUD

SELECT * FROM (
SELECT [Inbound Call Client Account] as [account] 
,convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) as [Date] 
,ROW_NUMBER() OVER(PARTITION BY [Activation Id] ORDER BY [Inbound Call Time] DESC) AS "Row_Number" 
    FROM [Call_Table] 
     where 
     convert(date,format(Dateadd(hh,1,[Inbound Call Time]),'dd/MM/yyyy'),103) >= '2017-09-01' 
     and [Chargeable Duration] = 0 
     and ([Inbound Connected Call Duration] IS NULL or [Inbound Connected Call Duration] <1) 
     and [Inbound Call Type] = 'normal operator call') AS foo 
WHERE foo.row_number = 3 
+0

我認爲這是前進的方向,但問題是原始查詢中的where條件消除了指向誤報的重複行。在呼入呼叫類型中,三重呼叫中只有1個「正常話務員呼叫」。解釋起來有點困難,但我需要使用從分組查詢中的非分組查詢中收集的知識。那有意義嗎? – tomdemaine

+0

當然,如果沒有對數據有更好的理解,我可以做的最好的辦法是去掉where子句並讓它玩。 – gh9

相關問題