Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在两列之间创建计数表,而不必列出每一列的名称?(SQL)_Mysql_Sql - Fatal编程技术网

Mysql 如何在两列之间创建计数表,而不必列出每一列的名称?(SQL)

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

例如,这是我感兴趣的数据集的一部分:

事件 行动 演员 事件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.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;