2017-07-31 6 views
1

私は過去の標準クエリでは経験が非常に限られていますが、複数のテーブル間の結合や関係については少し問題があります。複数のテーブルを結合して選択して新しいカラム名を作成する

私は、15分ごとにmysqlデータベースからいくつかの値を取得するジョブを作成することになっていますが、表示する必要がある情報は複数のテーブルから取得されます。

電話システム用のすべての関係を把握するために、私はしばらくそれを使用しましたが、私はすべてを引き出す必要があることを発見しましたが、私は仕事をする正しい方法を見つけることを試みていますジョイン。

私がという名前の列を持つ、私は必要な情報のための新しいテーブルを作成すると思っている:私は私の「ユーザー」テーブルとの一致から延長IDで開始する必要があることを知っている

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

それは私の '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

あなたは単に2つのテーブルに参加し、extensionIDでグループ化します。また、情報を要約して収集するための数式を追加します。

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

[OK]を、簡単な質問:将来的には、私はこのような2列を追加する場合: 合計をTotal_Outbound 、SUM(IF(LegType1 =#))として((LEGTYPE1 =#)があれば)Total_Inbound としてlegtype1に私はしたい場所すべての '1'を合計アウトバウンドとして、そして '2'をすべてインバウンドとして追加するには、それぞれポンド記号を1,2,1,2,1,2に置き換えますか?私は少しIF文で混乱しています –

+1

@TomN。それがあなたのために働くなら、答えを受け入れてください。 IF関数は3つの引数をとります。条件(true/falseに評価)、TRUEの値、およびFALSEの値。したがって、あなたの例では、#記号を3つのものに置き換えます。列の値が(あなたのテスト)と等しく、その後にカンマと1または0、別のカンマ、および第2引数の反対の値が続きます。 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

ありがとうございました。さて、1つの簡単な追加/質問。また、 'users'テーブルに参加し、それと 'callsession'テーブルの間でextensionIDを一致させる必要があるが、 'users'から '4-Digit Extension'として 'extension'を印刷する必要がある場合は、選択のc.extension? –

1

で参加して、グループを使用することができます。あなたがしなければならないことは、通話の回数と通話時間を集計することです。明示的に要求されない限り、これを行うために新しいテーブルを作成する必要はありません。 JOINとAGGREGATEの適切な組み合わせにより、必要な情報が得られます。これはかなり単純明快でなければなりません...唯一半興味深い部分は、それぞれのコールが応答されたかどうかの条件チェックとして「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 
関連する問題