Mysql 将多行结果合并为一行
我在按userID将多行结果组合成一行结果时遇到问题 我得到这个结果: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||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