0

顧客の会社の呼び出しレコードを含む3つのmysqlデータベーステーブルがあります。企業グループのデータベースから1時間ごとにデータを取得したいと思います。1時間データがない場合は、ゼロを返す必要があります。

このクエリを実行していますが、データベースにデータがある場合にのみ、その時間の結果を取得しています。

これが私の質問です。

select ph_Plans.Comp_ID, Plan_Type, ph_Companies.CompanyName,
    (sum(call_length_billable)*100)/(Plan_Limit*60) as total,
    hour(calldate)
from ph_Plans
join ph_Companies
    on ph_Companies.Comp_ID = ph_Plans.Comp_ID
join cdr
    on cdr.CompanyName = ph_Companies.CompanyName
where Plan_Type='Per_Min'
    and date(calldate)='2012-10-01'
    and ph_Companies.CompanyName='"ReadySpace-EN"'
group by hour(calldate);

これが得られている結果です。

+---------+-----------+-----------------+--------+----------------+
| Comp_ID | Plan_Type | CompanyName     | total  | hour(calldate) |
+---------+-----------+-----------------+--------+----------------+
|      44 | Per_Min   | "ReadySpace-EN" | 3.7467 |              1 |
|      44 | Per_Min   | "ReadySpace-EN" | 9.4933 |             18 |
|      44 | Per_Min   | "ReadySpace-EN" | 1.6600 |             20 |
|      44 | Per_Min   | "ReadySpace-EN" | 3.7333 |             21 |
|      44 | Per_Min   | "ReadySpace-EN" | 4.6067 |              2 |
|      44 | Per_Min   | "ReadySpace-EN" | 7.6533 |             23 |
+---------+-----------+-----------------+--------+----------------+

しかし、私は0時間から23時間までの結果が欲しいです。データがない場合は、ゼロを返す必要があります。

4

2 に答える 2

1

を実行するときは、結合されている列に対応するデータが両方にあるテーブルに対してJOINのみ行います。JOINやりたいことはLEFT JOIN、他のテーブルに対応するデータがない結果が必要な場合です。

このようなもの:

select ph_Plans.Comp_ID, Plan_Type, ph_Companies.CompanyName,
    if(call_length_billable IS NULL, 0, (sum(call_length_billable)*100)/(Plan_Limit*60)) as total,
    ifnull(hour(calldate), 0) hour
from ph_Plans
left join ph_Companies
    on ph_Companies.Comp_ID = ph_Plans.Comp_ID
left join cdr
    on cdr.CompanyName = ph_Companies.CompanyName
where Plan_Type='Per_Min'
    and (date(calldate)='2012-10-01' OR calldate IS NULL)
    and (ph_Companies.CompanyName='"ReadySpace-EN"' OR ph_Companies.CompanyName IS NULL)
group by hour(calldate);
于 2013-01-13T14:20:35.410 に答える
0

0 ~ 23 時間を生成するには 2 つの方法があります。このデモでは両方を見つけることができます。

  1. 一時テーブルの使用
  2. 使用してINFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY

最も典型的な方法を使用する場合、それは一時テーブルをテーブルと結合したままにすることです。以下の仮定を考慮して、これをメインのクエリに関連付けてください。

サンプルクエリ:

SELECT COALESCE(P.ID,0),
COALESCE(P.CALLDATE,0),
COALESCE(HOUR(P.CALLDATE),0) 
FROM NUMBERS A
LEFT JOIN
PLAN P
ON A.N = HOUR(P.CALLDATE)
GROUP BY A.N
;

結果:

| COALESCE(P.ID,0) | COALESCE(P.CALLDATE,0) | COALESCE(HOUR(P.CALLDATE),0) |
----------------------------------------------------------------------------
|                0 |                      0 |                            0 |
|                1 |    2013-01-03 01:11:14 |                            1 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                4 |    2013-01-03 09:51:02 |                            9 |
|                3 |    2013-01-03 10:50:20 |                           10 |
|                2 |    2013-01-03 11:31:24 |                           11 |
|                5 |    2013-01-03 12:30:00 |                           12 |
|                6 |    2013-01-03 13:41:01 |                           13 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                7 |    2013-01-03 16:19:08 |                           16 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                0 |                      0 |                            0 |
|                8 |    2013-01-03 20:18:30 |                           20 |
|                0 |                      0 |                            0 |
|               10 |    2013-01-04 22:21:50 |                           22 |
|                9 |    2013-01-03 23:01:44 |                           23 |
  • 仮定:

テーブルから生成された結果を示したので、同じクエリを使用して 0 ~ 23 時間のデータ テーブルと結合しました。さらに、上記のデモでそれらを作成するための完全なテーブル スキーマはないようです。さらに、どのテーブルに列があるかについては言及されていないcalldateので、テーブルにあると想定しましたPlan_Type

  • PS: この回答ではより多くのスペースが必要になるため、以前のコードを削除しました。
于 2013-01-13T14:57:30.370 に答える