SQL group actions



如何计算每个userId有多少个actionType并在单独的列中显示每个actionType

表:

CREATE TABLE history (
userId VARCHAR(40),
actionType ENUM('ban', 'unban', 'mute', 'unmute')
);

表中的示例内容:输入图片描述

输出示例:输入图片描述

这是一个关键问题。下面是可以用来解决我正在考虑的问题的查询,也可能有其他优化的解决方案。

SELECT  P.userid,
COUNT(CASE WHEN P.actiontype='ban' THEN 1 ELSE NULL END) AS 'ban',
COUNT(CASE WHEN P.actiontype='unban' THEN 1 ELSE NULL END) AS 'unban',
COUNT(CASE WHEN P.actiontype='mute'THEN 1 ELSE NULL END) AS 'mute',
COUNT(CASE WHEN P.actiontype='unmute' THEN 1 ELSE NULL END) AS 'unmute'
FROM    history P
GROUP BY P.userid;

在在线工具db<>fuddle中测试

示例数据与表定义不匹配。根据您的表定义,动作类型为"踢"。无效。但是您的输入数据和预期的结果都包含这种类型的行。因此,此答案假定您的表定义不正确。你可以为不同的动作类型建立总和。根据您的样例输入和期望的结果,这些类型是"静音"、"踢球"。或";ban"。所以你可以使用这样的查询:

SELECT userid,
SUM(actiontype='mute') AS mute,
SUM(actiontype='kick') AS kick,
SUM(actiontype='ban') AS ban
FROM history
GROUP BY userid;

如果您还想显示每天这些金额的总和,您可以这样做:

SELECT userid,
SUM(actiontype IN ('mute', 'kick', 'ban')) AS total,
SUM(actiontype='mute') AS mute,
SUM(actiontype='kick') AS kick,
SUM(actiontype='ban') AS ban
FROM history
GROUP BY userid;

如果你需要进一步的帮助,请检查你的问题,并确保样本数据和你的表定义是正确的。

最新更新