【问题标题】:MySQL Count IF and JOINMySQL 计数 IF 和 JOIN
【发布时间】:2013-03-19 16:30:05
【问题描述】:

我有两张桌子:

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

  2. ringcentral:| Date | Type | Action Result |

我的目标是在前 7 天获得以下输出:

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

我需要在两个单独的表中计算案例和呼叫,然后按日期加入计数并分组。我还在处理两个表中不同的日期格式,因此有古怪的 group by 和 join 函数。

我还需要让联接包括前 7 天的所有日期(deskcases 包含所有日期,所以我认为 INNER JOIN 应该在这里工作?)

要关闭,我尝试在下面运行以下查询,但在一两分钟后它只是搅动而没有结果。关于如何使它工作的任何想法?预先感谢您的帮助! :-)

(运行 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

【问题讨论】:

    标签: mysql count multiple-tables ringcentral


    【解决方案1】:

    在这种情况下,您绝对不应该按时加入。

    例如你可能有这样的数据:

    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 次。

    那么,您如何获取数据?要么写两条语句,要么将它们与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()。在deskcases 表中,您的日期列似乎是一个时间戳。当您从“2013-03-20 10:06:00”中减去 8 天时,您将得到“2013-03-12 10:06:00”,因此您将丢失“2013-03-12”之间的所有行00:00:00' 和 '2013-03-12 10: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
    

    【讨论】:

    • 感谢您的墓碑!我绝对同意您的所有观点,并感谢有关日期功能的提示。但是仍然有一个问题,当我尝试运行您的代码时出现语法错误:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'COUNT( *)AS TotalNumber FROM desktopcases WHERE desktopcases.Labels NOT LIKE '%SPAM%'' at line 3"
    • @user1812363 不知怎的,那里丢失了一些东西,纠正了它。请再试一次。
    • 现在可以了,我可以看到数据了!唯一的问题是我将此查询输入 PHP 脚本以在仪表板中显示此数据。我注意到你告诉我我们不应该按日期加入,但我不知道如何从这里开始,因为这是我需要的输出:-(
    • @user1812363 在我的回答中尝试更新。不确定我是否正确理解了这个问题。
    • @user1812363 你也可以随意给我投票,因为你很感激;)
    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多