每列的MySQL计数值
我正在尝试找出如何在多个列中计算值。 似乎我做的第一次计数给出了正确的结果,但是我试图得到的第二次列计数给出了错误的结果。 例如,对于以下两列 Q2 Q3 1 1 1 1 2 2 1 1 1 1 5 5 3 5 5 3 4 1 2 2 3 3 3 3 5 5 3 3 2 1 2 1 3 2 4 1 1 1 1 1 2 2 5 5 3 3 2 1 3 3 1 1 2 1 给我Q2的计数。7个一,7个二等等 然而,下面给了我一个意想不到的结果每列的MySQL计数值,mysql,sql,Mysql,Sql,我正在尝试找出如何在多个列中计算值。 似乎我做的第一次计数给出了正确的结果,但是我试图得到的第二次列计数给出了错误的结果。 例如,对于以下两列 Q2 Q3 1 1 1 1 2 2 1 1 1 1 5 5 3 5 5 3 4 1 2 2 3 3 3 3 5 5 3 3 2 1 2 1 3 2 4 1 1 1 1 1 2 2 5
SELECT COUNT(Q2) AS QU2, COUNT(Q3) AS QU3 FROM mytable GROUP BY Q2, Q3
7 4 3 1 5 1 2 1 3
我认为这与团队有关,但我不知道如何绕过它以获得所需的结果。所以我想知道结果
QU2 = 7 7 7 2 4
QU3 = 13 4 6 4
或
QU2 QU3
7 13
7 4
7 6
2 4
4.
等等,对于QU4 QU5。。。如果有任何帮助,我将不胜感激。谢谢你我想你需要解开数据。在这种情况下,这只意味着多个
分组方式
通过联合所有方式连接:
select 'q2' as which, q2, count(*) as cnt
from mytable
group by q2
union all
select 'q3' as which, q3, count(*) as cnt
from mytable
group by q3;
您可以添加任意多的子查询
注意:这会将值放在单独的行中,而不是单独的列中。我认为您需要取消填充数据。在这种情况下,这只意味着多个分组方式
通过联合所有方式连接:
select 'q2' as which, q2, count(*) as cnt
from mytable
group by q2
union all
select 'q3' as which, q3, count(*) as cnt
from mytable
group by q3;
您可以添加任意多的子查询
注意:这会将值放在单独的行中,而不是列中。我认为Asaph在正确的轨道上,但是我会稍微改变这一点,尝试从myTable中选择distinct count(Q2)作为QU2,count(Q3)作为QU3代码>我认为Asaph在正确的轨道上,但是我会稍微改变这一点,尝试从myTable中选择不同的计数(Q2)作为QU2,计数(Q3)作为QU3代码>我想这会让你最接近你想要的。您可以使用生成数字1的任何方法替换数字表,无论Q2或Q3中的最大值是多少
CREATE TABLE dbo.Numbers (num INT)
INSERT INTO dbo.Numbers (num) VALUES (1), (2), (3), (4), (5)
SELECT
N.num,
SUM(CASE WHEN MT.Q2 = N.num THEN 1 ELSE 0 END) AS QU2,
SUM(CASE WHEN MT.Q3 = N.num THEN 1 ELSE 0 END) AS QU3
FROM
dbo.Numbers N
CROSS JOIN dbo.My_Table MT
GROUP BY
N.num
添加额外的列(对于Q4等)只意味着添加另一个总和(CASE…
我认为这将使您最接近您想要的内容。您可以使用生成数字1的任何方法替换数字表,无论Q2或Q3中的最大值是多少
CREATE TABLE dbo.Numbers (num INT)
INSERT INTO dbo.Numbers (num) VALUES (1), (2), (3), (4), (5)
SELECT
N.num,
SUM(CASE WHEN MT.Q2 = N.num THEN 1 ELSE 0 END) AS QU2,
SUM(CASE WHEN MT.Q3 = N.num THEN 1 ELSE 0 END) AS QU3
FROM
dbo.Numbers N
CROSS JOIN dbo.My_Table MT
GROUP BY
N.num
添加其他列(对于Q4等)只意味着添加另一个SUM(CASE…
如何分组依据
工作?
让我们讨论一下您的第一个查询(我在SELECT
子句中添加了Q2
列,以使其输出更加清晰):
首先,如果存在WHERE
子句,它将获取与WHERE
条件匹配的所有行。因为您的查询没有WHERE
子句,所以将读取表中的所有行
在下一步中,上一步读取的行按照GROUP by
子句中指定的表达式进行分组(假设它只包含一个表达式,就像上面的查询那样)。在内部,对行进行分组需要首先对行进行排序
这就是此步骤中数据的组织方式。我在每组中的行之间添加了水平分隔符,以使所有内容都清晰明了:
Q2 Q3
-------
1 1
1 1
1 1
1 1
1 1
1 1
1 1
-------
2 1
2 1
2 1
2 1
2 2
2 2
2 2
-------
3 2
3 3
3 3
3 3
3 3
3 3
3 5
-------
4 1
4 1
-------
5 3
5 5
5 5
5 5
-------
在下一步中,它将从每个组创建一行,该行将进入生成的结果集
上面的查询清楚地返回:
Q2 QU2
--------
1 7
2 7
3 7
4 2
5 4
当GROUPBY
子句包含多个表达式时会发生什么情况?
让我们来看第二个查询(同样,我添加了一些列来显示其行为):
它的工作原理与上一个查询类似,但由于GROUP BY
子句包含两个表达式,因此为Q2
的值创建的每个组都根据Q3
的值拆分为子组。假设在GROUP BY
子句中存在另一个表达式(例如,Q4
),则为一对(Q2,Q3)
创建的每个子组将进一步划分为子组,用于Q4
的所有值,依此类推
对于您的表,组和子组如下所示:
Q2 Q3
=======
1 1
1 1
1 1
1 1
1 1
1 1
1 1
=======
2 1
2 1
2 1
2 1
---
2 2
2 2
2 2
=======
3 2
---
3 3
3 3
3 3
3 3
3 3
---
3 5
=======
4 1
4 1
=======
5 3
---
5 5
5 5
5 5
=======
我用双线分隔组,用较小的单线分隔每个组内的子组
此查询的输出为:
Q2 Q3 cnt
------------
1 1 7
2 1 4
2 2 3
3 2 1
3 3 5
3 5 1
4 1 2
5 3 1
5 5 3
如何获得期望的结果?
使用单个查询无法获得所需的结果。更重要的是,您建议的结果集没有多大意义
您可以使用UNION
组合两个查询,以获得所需的数据和帮助您了解这些数字来源的附加信息:
SELECT 'Q2' AS source, Q2 AS q, COUNT(Q2) AS cnt FROM mytable GROUP BY Q2
UNION
SELECT 'Q3' AS source, Q3 AS q, COUNT(Q3) AS cnt FROM mytable GROUP BY Q3
输出为:
source q cnt
----------------
Q2 1 7
Q2 2 7
Q2 3 7
Q2 4 2
Q2 5 4
Q3 1 13
Q3 2 4
Q3 3 6
Q3 5 4
很清楚,不是吗?前5行来自查询GROUP BY Q2
,它们在q
列中的值告诉每个组Q2
的值是多少(有7
出现在Q2
列中的1
,2
列中的7
,3
列中的7
,4
列中的2
,等等)。最后4行讲述了关于Q3
的类似故事(13
行在Q3
列中有1
等)
评论
COUNT(*)
与COUNT(Q2)
之间存在差异:COUNT(*)
对组中的行进行计数,COUNT(Q2)
计算列Q2
中的not-NULL
值。它不关心重复,只忽略NULL
值。如果要计算不同的值,则必须添加distinct
关键字:count(distinct Q2)
分组方式如何?
让我们讨论一下您的第一个查询(我在SELECT
子句中添加了Q2
列,以使其输出更加清晰):
首先,如果存在WHERE
子句,它将获取与WHERE
条件匹配的所有行。因为您的查询没有WHERE
子句,所以将读取表中的所有行
在下一步中,上一步读取的行按照GROUP by
子句中指定的表达式进行分组(假设它只包含一个表达式,就像上面的查询那样)
SELECT 'Q2' AS source, Q2 AS q, COUNT(Q2) AS cnt FROM mytable GROUP BY Q2
UNION
SELECT 'Q3' AS source, Q3 AS q, COUNT(Q3) AS cnt FROM mytable GROUP BY Q3
source q cnt
----------------
Q2 1 7
Q2 2 7
Q2 3 7
Q2 4 2
Q2 5 4
Q3 1 13
Q3 2 4
Q3 3 6
Q3 5 4