1

私は2つのテーブルを持っています:

  1. deskcases| CaseID | Resolved At(Date) | Labels |

  2. ringcentral| Date | Type | Action Result |

私の目標は、過去7日間に次の出力を取得することです。

| Date | Count of TotalResolvedCases | Count of Total Calls |

2つの別々のテーブルでケースと呼び出しをカウントしてから、カウントを結合して日付でグループ化する必要があります。また、2つのテーブルで異なる日付形式を扱っているため、奇抜なgroupby関数とjoin関数を使用しています。

また、過去7日間のすべての日付を参加に含める必要があります(deskcasesすべての日付があるので、INNER JOINはここで機能するはずです)

最後に、以下のクエリを実行しようとしましたが、1、2分経っても結果が得られずにチャーンします。これを機能させる方法について何かアイデアはありますか?よろしくお願いします!:-)

(MySQL 5.0.96の実行)

SELECT
DATE_FORMAT(
    deskcases.`Resolved At`,
    '%Y-%m-%d'
)AS Date1,
(
    SELECT
        COUNT(deskcases.`Case #`)
    FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > NOW()- INTERVAL 8 DAY
)AS TotalResolvedCases,
(
    SELECT
        COUNT(ringcentral.Counter)
    FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > NOW()- INTERVAL 8 DAY
)AS TotalCalls
FROM
 deskcases
INNER JOIN ringcentral ON DATE_FORMAT(
 deskcases.`Resolved At`,
 '%Y-%m-%d'
)= ringcentral.Date
GROUP BY
 Date1
ORDER BY
 Date1 ASC

編集

これを少し編集して結果を出すことができましたが、すべてのケースとサブセレクトクエリを使用した呼び出しをカウントしているようで、合計は日付でグループ化されていません。コードは次のとおりです。

SELECT
DATE_FORMAT(
    deskcases.`Resolved At`,
    '%Y-%m-%d'
)AS Date1,
(
    SELECT
        COUNT(deskcases.`Case #`)
    FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.`Case Status` LIKE '%Resolved%'
)AS TotalResolvedCases,
(
    SELECT
        COUNT(ringcentral.Counter)
    FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
)AS TotalCalls
FROM
  deskcases
LEFT OUTER JOIN ringcentral ON DATE_FORMAT(
  deskcases.`Resolved At`,
  '%Y-%m-%d'
)= ringcentral.Date
WHERE deskcases.`Resolved At` > NOW()- INTERVAL 8 DAY
GROUP BY
  Date1
ORDER BY
  Date1 ASC
4

1 に答える 1

0

この場合、あなたは絶対に日付に参加するべきではありません。

たとえば、次のデータがあります。

deskcases                           ringcentral
---------                           -----------
date      | whatever_d              date      | whatever_r
----------------------              ----------------------
today       x                       yesterday   u
yesterday   y
yesterday   z

今、あなたがそれらに参加するとき、あなたはこれを得るでしょう:

joinedTable
-----------
date      | whatever_d  |  whatever_r
-------------------------------------
today       x 
yesterday   y              u
yesterday   z              u

おっと、着メロテーブルから2倍のエントリを取得しましたが、必要なのは1つだけです。

では、どのようにしてデータを取得しますか?2つのステートメントを記述するか、それらをUNION:と組み合わせます。

SELECT
DATE(`Resolved At`) AS Date1,
"Deskcases" AS fromTable,
COUNT(*) AS TotalNumber
FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
UNION ALL
SELECT
`Date` AS Date1,
"ringcentral" AS fromTable,
COUNT(*) AS TotalNumber
FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2

NOW()また、に変更したことにも注意してくださいCURDATE()。デスクケーステーブルでは、日付列がタイムスタンプのようです。'2013-03-20 10:06:00'から8日を引くと、'2013-03-12 10:06:00'になるため、'2013-03-12の間のすべての行が失われます。 00:00:00'および'2013-03-1210:05:59'。また、のDATE()代わりに関数を使用しましたDATE_FORMAT()DATE_FORMAT()は多くの点で本当に素晴らしくて便利な関数ですが、この場合、使用するときに入力する文字を少なくする必要がありますDATE():)

アップデート:

SELECT 
Date1, 
SUM(CASE WHEN fromTable = 'Deskcases' THEN TotalNumber ELSE 0 END) AS TotalDeskcases,
SUM(CASE WHEN fromTable = 'ringcentral' THEN TotalNumber ELSE 0 END) AS TotalRingcentral 
FROM (
SELECT
DATE(`Resolved At`) AS Date1,
'Deskcases' AS fromTable,
COUNT(*) AS TotalNumber
FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
UNION ALL
SELECT
`Date` AS Date1,
'ringcentral' AS fromTable,
COUNT(*) AS TotalNumber
FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
) sq
GROUP BY Date1
于 2013-03-20T09:09:40.893 に答える