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 将多行结果合并为一行_Mysql_Sql_Group By_Pivot - Fatal编程技术网

Mysql 将多行结果合并为一行

Mysql 将多行结果合并为一行,mysql,sql,group-by,pivot,Mysql,Sql,Group By,Pivot,我在按userID将多行结果组合成一行结果时遇到问题 我得到这个结果: ||userID||eventTypeID||COUNT(*)|| || 1 || 1 || 1 || || 1 || 2 || 1 || || 2 || 1 || 1 || || 3 || 2 || 1 || 我想这样做: ||userID||eventTypeID ONE||

我在按userID将多行结果组合成一行结果时遇到问题

我得到这个结果:

||userID||eventTypeID||COUNT(*)||  
||  1   ||    1      ||    1   ||  
||  1   ||    2      ||    1   ||  
||  2   ||    1      ||    1   ||   
||  3   ||    2      ||    1   ||
我想这样做:

||userID||eventTypeID ONE||COUNT()||eventTypeID TWO||COUNT()||
等等

我不知道我是如何做到这一点的,我已经尝试了pivotSQL和concat,但我无法让它工作

我的SQL查询:

SELECT eventMatch.userID, eventMatch.eventTypeID, COUNT( * )   
FROM  `eventMatch` , activity, activityMatch  
WHERE eventMatch.activityID = activity.activityID  
AND activity.activityID = activityMatch.activityID  
AND activity.khID =1  
GROUP BY eventTypeID, userID  
ORDER BY userID ASC  
希望有人能帮忙,也许很简单,但我已经尝试了两天的解决方案:-

谢谢..

试试这个:

SELECT
  eventMatch.userID, 
  SUM(eventMatch.eventTypeID = 1) As TypeOne,
  SUM(eventMatch.eventTypeID = 2) As TypeTwo, 
  COUNT( * )   
FROM  `eventMatch` 
INNER JOIN activity      ON eventMatch.activityID = activity.activityID 
INNER JOIN activityMatch ON activity.activityID = activityMatch.activityID  
WHERE activity.khID =1  
GROUP BY userID  
ORDER BY userID ASC;
更新1 对于多个事件类型,您可以这样动态执行此操作:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(em.eventTypeID = ''',
      em.eventTypeID, ''', 1, 0)) AS Type',
      em.eventTypeID )
  ) INTO @sql
FROM  `eventMatch`       AS em;

SET @sql = CONCAT('SELECT em.userID, ', @sql,
                  ', COUNT( * )   
                  FROM  `eventMatch`       AS em
                  INNER JOIN activity      AS  a ON em.activityID = a.activityID 
                  INNER JOIN activityMatch AS am ON a.activityID = am.activityID  
                  GROUP BY em.userID  
                  ORDER BY em.userID ASC  ;');

prepare stmt 
FROM @sql;

execute stmt;
更新2 如果要从EventTypes表中排除所有类型,即使该类型在others表中没有匹配项,也应该在第一步中从该表EventTypes中动态获取类型列表,而不是从eventmatch表中获取类型列表,然后以与前面相同的方式执行动态查询。像这样:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(em.eventTypeID = ''',
      em.eventTypeID, ''', 1, 0)) AS Type',
      em.eventTypeID )
  ) INTO @sql
FROM  eventTypes       AS em; -- <---------- this is what I changed.


SET @sql = CONCAT('SELECT em.userID, ', @sql,
                  ', COUNT( * )   
                  FROM  `eventMatch`       AS em
                  INNER JOIN activity      AS  a ON em.activityID = a.activityID 
                  INNER JOIN activityMatch AS am ON a.activityID = am.activityID  
                  GROUP BY em.userID  
                  ORDER BY em.userID ASC  ;');

prepare stmt 
FROM @sql;

execute stmt;


作业?

您可以使用带有游标迭代和结果的存储过程来添加字符串。有多少不同的eventType?@Michael-对,我知道有3种不同的eventType,但eventType是不时添加的,因此它会发生变化,如果是这样,那么它就不正确了,但是如果eventTypeID distinct count将增加,比他应该使用的存储过程要多flexible@user2046146是的,在这种情况下,您必须动态执行此操作,我将使用动态版本更新我的答案。请给我几分钟。@user2046146-没关系,您应该编写它,注意它在这个演示中运行良好,但在您的电脑中,您可能需要定义一个类似于此分隔符的分隔符//创建过程GetEventTypesCounts BEGIN-与我的存储过程中的代码相同;结束//分隔符;。因此,请尝试一下,如果不起作用,请添加分隔符。@user2046146抱歉,最后一个要求将取决于这些表之间的关系,请您使用一些示例数据设置演示。我已经创建了表,但是我需要一些示例数据。请使用所有表的一些示例数据进行更新,并向我显示您从这些表中查找的结果,这将非常有用。@user2046146抱歉,时间太晚了。我现在正在工作:。很抱歉无论如何,您的最后一个需求太复杂,很容易实现,但存在两个问题。两列UserId和activityid都通过两个表相互关联。那么,在结果中,您希望如何处理每个用户标识的重复项呢?它将为您提供所需的内容,并且它是样本数据的正确输出,您需要对其进行测试并确保它对您正常工作。
GROUP BY eventMatch.userID, eventMatch.eventTypeID