0

こんにちは、mysql にクエリを実行し、データのリストを取得して json エンコードし、グラフ (たとえば、金額と日付の軸) にプロットするという、わずかな問題があります。ただし、SQL は当然のことながら、データがないクエリ データの日付を返しません。そのため、グラフには日付がありません。

私はここで、空白を埋めるためだけに他のテーブルを作成する仕事をしている人々を読みました。これは私にとって選択肢ではありません。

クエリ内のすべての日付の配列を作成するソリューションがあります。

これをクエリ結果の多次元配列に圧縮する方法を誰かが提案できますか。うまくいけば、巧妙な foreach の何らかの手段によって。

または、空白の日付を埋めることができるかどうかわからないSQL関数はありますか?

私のクエリは現在次のようになっています:

    SELECT SQL_CALC_FOUND_ROWS Date, SUM(call_answer) AS call_answer, SUM(call_busy) AS call_busy, SUM(call_noanswer) AS call_noanswer, SUM(call_notrec) as call_notrec
    FROM ( 
        SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, COUNT(id) as call_answer, 0 as call_busy, 0 as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND dialStatus = 'NORMAL_CLEARING' GROUP BY Date ) 
            AS t_0 
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, COUNT(id) as call_busy, 0 as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND dialStatus = 'USER_BUSY' GROUP BY Date )
            AS t_1
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, COUNT(id) as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND (dialStatus = 'ORIGINATOR_CANCEL' OR dialStatus = 'NO_USER_RESPONSE') GROUP BY Date )
            AS t_2
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, 0 as call_noanswer, COUNT(id) as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND (dialStatus = 'UNALLOCATED_NUMBER' OR dialStatus = 'INVALID_NUMBER_FORMAT') GROUP BY Date )
            AS t_3

    )

    AS t_total
    GROUP BY Date;

だからすでにかなり面倒です。

4

1 に答える 1

0

MySQL での比較の結果は数値であるという事実を利用して、SQL クエリを簡素化できます。false の場合は 0、true の場合は 1。したがって、比較を合計してカウントを計算できます。

SELECT DATE(dateCreated) AS `Date`,
 SUM(dialStatus = 'NORMAL_CLEARING') AS call_answer,
 SUM(dialStatus = 'USER_BUSY') AS call_busy,
 SUM(dialStatus = 'ORIGINATOR_CANCEL') AS call_noanswer,
 SUM(dialStatus = 'UNALLOCATED_NUMBER') AS call_notrec
FROM cdr 
WHERE company = '8346767432431'
  AND dateCreated BETWEEN '2012-10-16' AND '2012-11-16' -- = 11-16 0:00 !
GROUP BY DATE(dateCreated) ASC

このクエリと元のクエリの両方で、範囲の終わりは暗黙的に の時間を想定することに注意してください0:00。したがって、最初の 1 秒を除いて、その日は含めません。それを調整する必要があるかもしれません。

物事をどのように組み合わせるかという実際の問題に関しては、上記のクエリは日付を昇順で生成します。したがって、日付のリストを取得して、そのリストの最初の項目が次のレコードの日付と等しいかどうかを確認します。これは当てはまりませんが、結果データにゼロの行を挿入し、リストの次の日付に進み、クエリの現在のレコードをそのまま維持します。

于 2012-11-16T12:08:37.317 に答える