2017-11-29 2 views
0

私は毎日午前7時45分から午後5時まで、タスクスケジュールでPHPスクリプトを実行しています。これは素晴らしい機能ですが、最初の実行ではまだレコードが作成されていないため、何も返されません(レコードをCSRエージェントが呼び出すことによって作成されます)。私は、SQLのクエリを選択し、集計し、テーブルに値を挿入し、それらの値からJSONファイルを作成するスクリプトで実行している。この場合も、最初の実行以外はすべて完璧です。select(タスクスケジューラで実行されているsqlスクリプト)に空の戻り値0を挿入する

これに何かを追加できるかどうか尋ねられました。その最初のジョブが何も返されない場合は、すべてに対して0を挿入します。そうすれば、システムでレコード/コールなしで5回実行されても、データは残っていて、CSR画面には何かが表示されます。これを行うにはかなり簡単な方法がありますか?ここで

は、スクリプトのバルクです:

$data = mysqli_query($conn2, 
     "SELECT 
      case 
      when callingpartyno  in (select extension from test.test_users) 
      then callingpartyno 
      when finallycalledpartyno in (select extension from test.test_users) 
      then finallycalledpartyno 
      end as extension 
      , sum(duration) as total_talk_time_seconds 
      , round(sum(duration)/60,2) as total_talk_time_minutes 
      , sum(if(legtype1 = 1,1,0)) as total_outbound 
      , sum(case when(legtype1 = 1 and duration > 60) then 1 else 0 end) as credit_for_outbound 
      , sum(if(legtype1 = 2,1,0) and answered = 1) as total_inbound 
      , sum(if(legtype1 = 2,1,0) and answered = 0) as total_missed 
      , sum(if(legtype1 = 1, 1, 0)) +     -- outbound calls 
      sum(if(legtype1 = 2, 1, 0)) as total_calls 
      ,round((sum(if(legtype1 = 2,1,0) and answered = 1))/(sum(if(legtype1 = 1, 1, 0)) +     -- outbound calls 
      sum(if(legtype1 = 2, 1, 0))) * 100,2) as percent_answered 
      , now() as time_of_report 
      , curdate() as date_of_report 
     FROM 
      test.session a 
      join test.callsummary b 
      on a.notablecallid = b.notablecallid 
      where 
      date(a.ts) >= curdate() 
      and (
      callingpartyno in (select extension from test.test_users 
      ) 
      or finallycalledpartyno in (select extension from test.test_users 
      ) 
      ) 
      group by 
      extension") or die(mysqli_error($conn2)); 


    $stmt = mysqli_prepare($conn2, 
     "INSERT into test.test_totals 
       (extension, 
       total_talk_time_seconds, 
       total_talk_time_minutes, 
       total_outbound, 
       credit_for_outbound, 
       total_inbound, 
       missed_calls, 
       total_calls, 
       percent_answered, 
       date_of_report, 
        time_of_report) 
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
     ON duplicate key 
     update 
       total_talk_time_seconds = values(total_talk_time_seconds), 
       total_talk_time_minutes = values(total_talk_time_minutes), 
       total_inbound = values(total_inbound), 
       total_outbound = values(total_outbound), 
       credit_for_outbound = values(credit_for_outbound), 
       missed_calls = values(missed_calls), 
       total_calls = values(total_calls), 
       percent_answered = values(percent_answered), 
       time_of_report = NOW()") or die(mysqli_error($conn2)); 

答えて

1

時々ゼロ拡張行は(無通話、ノー拡張、何の結果)

は今ので、あなたのクエリを変更しない

()があるので、問題が来ますあなたが選択したものは単純なサブクエリから来て、常に真であるON句を使用して残りのデータを結合します。

http://sqlfiddle.com/#!9/9b2a1/6を参照してください。疑似テーブルを生成するサブクエリは常にレット1行1列。 Table1サブクエリが1つ以上の行を返した場合、t行はまったく同じように繰り返されます。 Table1サブクエリがゼロの行を返した場合、クエリ全体は1つの行を持ちます。この問合せはゼロ行を戻すことはできません。実際のデータテーブルに特定の期間の行がない場合でも、全体のクエリは1行(nullの拡張子を持つ;必要に応じて値に合併することができます)を返すように、クエリに行う必要があります

編集:あなたのSQLは、本質的に小文字である

SELECT 
    case 
    when YOUR_SUBQUERY.callingpartyno in (select extension from test.test_users) then YOUR_SUBQUERY.callingpartyno 
    when YOUR_SUBQUERY.finallycalledpartyno in (select extension from test.test_users) then YOUR_SUBQUERY.finallycalledpartyno 
    end as extension 
    , sum(YOUR_SUBQUERY.duration) as total_talk_time_seconds 
    , round(sum(YOUR_SUBQUERY.duration)/60,2) as total_talk_time_minutes 
    , sum(if(YOUR_SUBQUERY.legtype1 = 1,1,0)) as total_outbound 
    , sum(case when(YOUR_SUBQUERY.legtype1 = 1 and duration > 60) then 1 else 0 end) as credit_for_outbound 
    , sum(if(YOUR_SUBQUERY.legtype1 = 2,1,0) and YOUR_SUBQUERY.answered = 1) as total_inbound 
    , sum(if(YOUR_SUBQUERY.legtype1 = 2,1,0) and YOUR_SUBQUERY.answered = 0) as total_missed 
    , sum(if(YOUR_SUBQUERY.legtype1 = 1, 1, 0)) +     -- outbound calls 
    sum(if(YOUR_SUBQUERY.legtype1 = 2, 1, 0)) as total_calls 
    , round((sum(if(YOUR_SUBQUERY.legtype1 = 2,1,0) and YOUR_SUBQUERY.answered = 1))/(sum(if(YOUR_SUBQUERY.legtype1 = 1, 1, 0)) +     -- outbound calls 
    sum(if(YOUR_SUBQUERY.legtype1 = 2, 1, 0))) * 100,2) as percent_answered 
    , TIME_OF_REPORT 
    , DATE_OF_REPORT 
FROM 
    (SELECT NOW() AS TIME_OF_REPORT, CURDATE() AS DATE_OF_REPORT) T 
    LEFT OUTER JOIN 
    (
     SELECT * FROM 
     test.session a 
     join test.callsummary b 
      on a.notablecallid = b.notablecallid 
     where 
      date(a.ts) >= curdate() and 
      (
      callingpartyno in (select extension from test.test_users) 
      or 
      finallycalledpartyno in (select extension from test.test_users) 
     ) 
) YOUR_SUBQUERY 
    ON 1=1 
    group by 
    DATE_OF_REPORT, TIME_OF_REPORT, extension 

:クエリの観点から

、それはより次のようになります。私は大文字でビットを追加しました。私はあなたのテーブル構造とサンプルデータの何も知らないので、私はこれをテストすることはできませんので、あなたからのいくつかのデバッグが必要かもしれませんが、本質的に(SELECT NOW() AS TIME_OF_REPORT, CURDATE() AS DATE_OF_REPORT) Tは常に1行を返さなければなりません。 YOUR_SUBQUERYはN行に0を戻すことができます。 YOUR_SUBQUERYの0行の場合、全体的なレポートは1行(時間と日付を指定するNOW()とCURDATE ) - curdateは、NOW()によってすでに与えられている情報を提供するだけであるが、残しておきます)とnullの拡張子を持つように重複しているようです。すべての合計は0にする必要がありますが、 IF(something_that_is_null = 2, 1, 0)のように実行すると、MySQLのIF関数はnullを返します(これは私の心にはないはずです;テストは0に戻って返され、0として合計されるべきです)。最初の実行時にすべてのカウントが0ではなく0であることが分かった場合は、COALESCE(logic_doing_sum_here、0)を使用してNULLを0に戻すことができます。ヌル拡張が煩わしい場合は、COALESCEを使用して、デフォルト値

+0

申し訳ありませんが、私はそのフィドルを見て理解すると思いますが、どうすれば既存のクエリを正確に変更する必要がありますか? My now()はselect内の多くの変数の1つで、サブクエリでラップするだけですか? –

+0

かなり、私はビットのmroe情報を与えるために質問を編集します(iphoneから答えを書いた、それは私の上にコードをコピーして貼り付けることに適切な痛みです –

+0

ああ、ありがとう!正しく編集する方法がわかりませんでした。 –

関連する問題