我正在处理一个查询,需要在列中输出用户的“总体约定”,例如1 -eng列将显示具有一个约定的用户,第二列2-eng将显示已完成2次约定的用户。同样3eng,依此类推。请注意,显示应该是这样的。我有一个具有userID的订婚表。所以我得到了像这样的不同用户
select count(distinct userID) from engagements
我接受了
select count(*) from engagements
此处的参与是指喜欢,回复或分享内容的用户
请帮忙。谢谢!我使用过CASE和IF但无法以下面的形式显示
1eng 2eng 3eng
100 200 100
答案 0 :(得分:0)
考虑在行中返回结果,然后在应用程序中将其旋转。
要在行中返回所需的结果,可以使用以下查询:
SELECT
engagementCount,
COUNT(*) AS userCount
FROM (
SELECT
userID,
COUNT(*) AS engagementCount
FROM engagements
GROUP BY userID
) AS s
GROUP BY engagementCount
;
基本上,您首先按engagements
对userID
行进行分组,然后获得每userID
行数。之后,您将计数用作分组标准,并计算找到该计数的用户数。
如果您坚持在SQL中返回柱状视图,则需要使用动态SQL,因为最终结果集中的列数不确定。您可能需要临时存储内部SELECT的结果,扫描它以构建每个engagementCount
值的计数表达式列表,并最终构造此类查询:
SELECT
COUNT(engagementCount = 1 OR NULL) AS `1eng`,
COUNT(engagementCount = 2 OR NULL) AS `2eng`,
COUNT(engagementCount = 3 OR NULL) AS `3eng`,
...
FROM temporary_storage
;
或SUM(engagementCount = value)
代替COUNT(engagementCount = value OR NULL)
。 (对我来说,后者更明确地表达了意图,因此我首先建议它,但是,如果你碰巧更喜欢SUM
技术,那么两者之间的表现应该没有明显差异。解释OR NULL
技巧here。)