Mysql 如何在两列之间创建计数表,而不必列出每一列的名称?(SQL)
例如,这是我感兴趣的数据集的一部分: 事件 行动 演员 事件1 行动B 阿克特罗克斯 事件2 行动B 阿克托兹 事件1 行动a 工厂 事件2 行动C 阿克托兹 事件3 行动a 阿克特罗克斯 事件3 行动B 阿克托兹 事件2 行动B 阿克托兹 事件2 行动a 工厂 您可以将其创建为行中的对,而不是矩阵:Mysql 如何在两列之间创建计数表,而不必列出每一列的名称?(SQL),mysql,sql,Mysql,Sql,例如,这是我感兴趣的数据集的一部分: 事件 行动 演员 事件1 行动B 阿克特罗克斯 事件2 行动B 阿克托兹 事件1 行动a 工厂 事件2 行动C 阿克托兹 事件3 行动a 阿克特罗克斯 事件3 行动B 阿克托兹 事件2 行动B 阿克托兹 事件2 行动a 工厂 您可以将其创建为行中的对,而不是矩阵: select t1.action, t1.actor, t2.actor, count(*) from t t1 join t t2 on t1.action = t2.act
select t1.action, t1.actor, t2.actor, count(*)
from t t1 join
t t2
on t1.action = t2.action
group by t1.action, t1.actor, t2.actor;
将数据旋转到矩阵中最好在应用程序层进行处理。您也可以构造动态SQL来实现这一点。或者您可以构造一个JSON数据结构来包含元素。尝试使用
@sql
和@sql2
变量设置为NULL
;如果之前使用过变量,我们将其重置为NULL
@sql
变量添加为计数方法SUM()
,并将CASE
表达式设置为匹配参与者值:时,选择@sql代码>,您将得到以下结果:
SUM(CASE WHEN Actor = "ActorX" THEN 1 ELSE 0 END) AS ActorX,
SUM(CASE WHEN Actor = "ActorY" THEN 1 ELSE 0 END) AS ActorY,
SUM(CASE WHEN Actor = "ActorZ" THEN 1 ELSE 0 END) AS ActorZ
SELECT Action,
SUM(CASE WHEN Actor = "ActorX" THEN 1 ELSE 0 END) AS ActorX,
SUM(CASE WHEN Actor = "ActorY" THEN 1 ELSE 0 END) AS ActorY,
SUM(CASE WHEN Actor = "ActorZ" THEN 1 ELSE 0 END) AS ActorZ
FROM mytable
GROUP BY Action
ORDER BY Action
使用选择的最终查询组合设置@sql2
变量。。。来自表
,其中包含在@sql
变量中设置的动态生成列
此时,当您运行时,选择@sql2代码>,您将得到以下结果:
SUM(CASE WHEN Actor = "ActorX" THEN 1 ELSE 0 END) AS ActorX,
SUM(CASE WHEN Actor = "ActorY" THEN 1 ELSE 0 END) AS ActorY,
SUM(CASE WHEN Actor = "ActorZ" THEN 1 ELSE 0 END) AS ActorZ
SELECT Action,
SUM(CASE WHEN Actor = "ActorX" THEN 1 ELSE 0 END) AS ActorX,
SUM(CASE WHEN Actor = "ActorY" THEN 1 ELSE 0 END) AS ActorY,
SUM(CASE WHEN Actor = "ActorZ" THEN 1 ELSE 0 END) AS ActorZ
FROM mytable
GROUP BY Action
ORDER BY Action
使用以下命令准备、执行并释放语句李>
认真考虑应用程序代码中的数据显示问题
SELECT Action,
SUM(CASE WHEN Actor = "ActorX" THEN 1 ELSE 0 END) AS ActorX,
SUM(CASE WHEN Actor = "ActorY" THEN 1 ELSE 0 END) AS ActorY,
SUM(CASE WHEN Actor = "ActorZ" THEN 1 ELSE 0 END) AS ActorZ
FROM mytable
GROUP BY Action
ORDER BY Action
PREPARE stmt FROM @sql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;