2017-07-31 100 views
1

我對MySQL過去的標準查詢的經驗非常有限,但是涉及多個表之間的連接和關係時,我有點問題。加入並選擇多個表格並創建新列名稱

我的任務是創建一個作業,每隔15分鐘從mysql數據庫中提取一些值,但它需要顯示的信息是從多個表中提取的。

我已經使用了它一段時間來找出電話系統的一切之間的關係,我發現我需要把所有東西都拉出來,但我試圖找到正確的方式來創建工作來做連接。

我想爲我的信息需要,與列命名爲創建一個新表:

Extension | Total Talk Time | Total Calls | Outbound Calls | Inbound Calls | Missed Calls 

我知道我需要開始從我的「用戶」表和匹配擴展ID它在'callSession'中帶有'extensionID'。每個extensionID可能有多個實例,但每個實例都會創建一個新的'UniqueCallID'。

'UniqueCallID'字段然後匹配我'CallSum'表中的'UniqueCallID'。在那一點上,我只需要能夠說「對於與同一個」extensionID「關聯的每個'uniqueCallID',獲取每列中所有實例的總和或這些實例的計數」。

這裏是什麼,我需要做的一個例子:

callSession Table 

UniqueCallID | extensionID | 
---------------------------- 
A    123 
B    123 
C    123 

callSum table 

UniqueCallID | Duration | Answered | 
------------------------------------ 
A    10   1 
B    5   1 
C    15   0 

newReport table 

Extension | Total Talk Time | Total Calls | Missed Calls 
-------------------------------------------------------- 
123   30    3    1 

希望這正確傳達我的想法。

如果我創建一個表來保存這些值,我需要知道如何根據該圖選擇,連接和插入這些東西,但我無法構造正確的查詢/語句。

+1

嗨。你爲什麼要將'extensionID'保存在不同的表中? – Horaciux

+1

TL; DR;請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

回答

1

您只需加入兩個表,然後在extensionID上做一個group。此外,添加公式來彙總和收集信息。

SELECT 
    `extensionID` AS `Extension`, 
    SUM(`Duration`) AS `Total Talk Time`, 
    COUNT(DISTINCT `UniqueCallID`) as `Total Calls`, 
    SUM(IF(`Answered` = 1,0,1)) AS `Missed Calls` 
FROM `callSession` a 
JOIN `callSum` b 
    ON a.`UniqueCallID` = b.`UniqueCallID` 
GROUP BY a.`extensionID` 
ORDER BY a.`extensionID` 
+0

非常感謝你,這正是我正在尋找的! –

+0

好,快速的問題:在未來,如果我加2列是這樣的: SUM(IF(LEGTYPE1 =#))作爲Total_Outbound ,SUM(IF(LegType1 =#))作爲Total_Inbound 其中legtype1我想將所有'1'作爲入站總數和全部'2'加入入站,我會分別用1,2,1和2,1,2替換井號嗎?我對IF語句感到困惑 –

+1

@TomN。如果它適合你,請接受答案。 IF函數有三個參數。條件(評估爲true/false),值爲TRUE,值爲FALSE。所以在你的例子中,你用#3代替#符號。該列等於(您的測試)的值,後跟逗號和1或0,另一個逗號以及第二個參數的相反值。 IOW,如果它是1,那麼0或反之亦然。 –

1

可以使用由

select 
     a.extensionID 
     , sum(b.Duration) as Total_Talk_Time 
     , count(b.Answered) as Total_Calls 
     , count(b.Answered) -sum(b.Answered) as Missed_calls 
    from callSession as a 
    inner join callSum as b on a.UniqueCallID = b.UniqueCallID 
    group by a.extensionID 
+0

謝謝你,似乎工作很好。現在,一個快速添加/問題。如果我還需要加入'用戶'表並匹配它與'callsession'表之間的extensionID,然後從'users'打印'extension'作爲'4-Digit Extension',我會以c身份加入用戶,然後放置選擇中的c.extension? –

1

此連接和組應該做的伎倆。你被要求做的是聚合呼叫的數量和持續時間。除非明確要求,否則不需要創建新表來執行此操作。 JOIN和AGGREGATEs的正確組合將獲得您需要的信息。這應該是相當簡單的......唯一半有趣的部分是計算未接來電的數量,這是通過使用「CASE」語句作爲每個來電是否應答的條件檢查來完成的。

請原諒我的語法...我的經驗是與SQL Server。

SELECT CS.Extension, SUM(CA.Duration) [Total Talk Time], COUNT(CS.UniqueCallID) [Total Calls], SUM(CASE CS.Answered WHEN '0' THEN SELECT 1 ELSE SELECT 0 END CASE) [Missed Calls] 
FROM callSession CS 
INNER JOIN callSum CA ON CA.UniqueCallID = CS.UniqueCallID 
GROUP BY CS.Extension