2015-09-03 32 views
0

使用Microsoft SQL Server,Table1有客戶請求,table2有一個解析代碼(所以我們可以看到客戶寫入的原因以及我們如何解決他們的問題) 。有時代表忘記添加解析代碼,所以我試圖運行一個查詢來告訴我每個代表的名稱,有多少封閉的問題缺少解析代碼,它們總共關閉了多少問題,以及它們的%封閉問題與封閉問題沒有解決方案代碼。例如:查詢同一個表兩次以在一個查詢中獲得不同的數字

Agent Name | Missing Resolution Codes | Total issues closed | % of 
---------------------------------------------------------------------- 
Mary  |    12   |   120   | 10.00% 
Bob  |    8   |   704   | 1.14% 

查詢顯示缺少分辨率代碼的效果很好。顯示總問題的查詢關閉很有效。每當我試圖把它們結合起來,我要麼得到這樣的:

(與UNION)

Mary | 12 
Mary | 120 
Bob | 8 
Bob | 704 

,或者如果我嘗試from (select...) t1, (select...) t2,我得到這個:

Mary | 12 | 120 
Mary | 12 | 704 
Bob | 8 | 120 
Bob | 8 | 704 

如果我添加一個Group By最後,我會遇到各種各樣的錯誤。是

這兩個查詢自己如下:

失蹤分辨率代碼:

select i.assigned_to, count(i.assigned_to) 
from customer_issues as i 
left join resolution_codes as r on i.issue_ID = r.issue_ID 
where r.issue_id is null 
and i.status='closed' 
group by i.assigned_to 

總計已解決的問題:

select assigned_to, count(assigned_to) 
from customer_issues 
where status='closed' 
group by assigned_to 

感謝任何幫助,您可以提供!

編輯:只是爲了澄清,決議代碼是在不同的表中,因爲一個客戶問題可能包含幾個問題和幾個解決方案。因此,儘管customer_issues表確實有一個指標,這個問題本身是封閉的,在resolution_codes表顯示了不同的問題,客戶有,我們可以解決哪些,哪些我們不能等

+0

你的期望的輸出是在一個場和關閉分辨率計數在另一個?可以從(select ...)選擇t1.name,.... t1 JOIN(選擇...)t2 ON t1.name = t2.name' –

+0

使用第二種方法,並將t1和t2關聯到assigned_to。 –

回答

0
select t1.assigned_to, t1.missing, t2.total from 
( 
select i.assigned_to as assigned_to, count(i.assigned_to) as missing 
from customer_issues as i 
left join resolution_codes as r on i.issue_ID = r.issue_ID 
where r.issue_id is null 
and i.status='closed' 
group by i.assigned_to 
) t1 INNER JOIN 
(
select assigned_to, count(assigned_to) as total 
from customer_issues 
where status='closed' 
group by assigned_to 
) t2 
ON t1.assigned_to=t2.assigned_to 
+0

工作,非常感謝你!這是缺少「where t1.assigned_to = t2.assigned_to」的地方。 – SpiceWeasel

+0

儘管有效,但建議避免不贊成使用的語法(使用逗號分隔的表列表創建交叉連接,並限制'WHERE'子句很長時間不符合標準,但工作正常)。更重要的是,整個事情可以在一個查詢中完成,這會提高性能。 –

0

由於兩個查詢之間的唯一區別似乎是左連接和空篩選器,您可以在一個查詢中完成所有操作。

這應該工作,我認爲:

;with source as (
    select 
     i.assigned_to as [Agent Name], 
     count(r.issue_id) as [Resolution Codes], 
     count(i.assigned_to) as [Total issues closed] 
    from customer_issues as i 
    left join resolution_codes as r on i.issue_ID = r.issue_ID 
    where i.status='closed' 
    group by i.assigned_to 
) 

select 
    [Agent Name], 
    [Total issues closed]-[Resolution Codes] as [Missing Resolution Codes], 
    [Total issues closed], 
    ([Total issues closed]-[Resolution Codes])*100.0/[Total issues closed] as [% of] 
from source; 

Sample SQL Fiddle

+0

當我嘗試這個時,我得到零錯誤的devide。當我移除視覺部分時,我可以看到原因。 「NULL」的代理名稱在丟失分辨率代碼下顯示-335,關閉總問題代碼爲0。添加「assigned_to不爲空」似乎也解決了這個問題。 – SpiceWeasel

+0

@SpiceWeasel我很可能錯過了某些東西,因爲我對你的表格有所猜疑,並沒有任何好的數據來測試。我不明白爲什麼它會做零分,但如果你說我相信你。您是否嘗試過小提琴或上面的代碼?我改變了一下。 – jpw

0

(更新)

顯然,沒有一個解決代碼未在表customer_issues任何地方反映,但只有在沒有resolution_codes中的任何一行對應於給定的問題。這看起來有點蹊蹺,但在更大的計劃中可能是明智的。無論如何,您可以執行單個聚合查詢來一次性收集所需的所有統計數據,然後根據結果計算所有派生統計數據。

來執行聚集查詢作爲內嵌視圖,以便更容易地(和較少冗長)重用兩個聚合列是非常有用的:

select 
    agg.assigned_to, 
    agg.total_closed, 
    (agg.total_closed - agg.with_code) as without_code, 
    ((agg.total_closed - agg.with_code)/cast(agg.total_closed as float)) as "% without" 
FROM (
    select 
     ci.assigned_to, 
     count(*) as total_closed, 
     count(rc.issue_id) as with_code 
    from customer_issues ci 
     left join resolution_codes rc on ci.issue_ID = rc.issue_ID 
    where ci.status='closed' 
    group by ci.assigned_to 
) agg 
    ; 
+0

我喜歡你的想法,但是當我嘗試查詢時,我得到了assigned_to和total_closed的列表。 without_code和%without都是零。這些表是十多年前設置的,所以我認爲在這種情況下我仍然需要使用聯接? – SpiceWeasel

+0

@SpiceWeasel,嗯。可能我對數據結構做了一個錯誤的假設,正如我的斷言所概括的那樣:「缺少解析代碼必須顯示爲'customer_issues.issue_ID IS NULL'」。如果相反缺少分辨率代碼僅僅在沒有來自表'resolution_codes'的行時才顯示,那麼是的,您確實需要一個連接。我已經更新了我的答案以承擔此案。 –

+0

此外,我添加了一些括號並轉換爲限定名稱,但我認爲這兩者都不是必需的。 –

相關問題