Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 - Fatal编程技术网

每列的MySQL计数值

每列的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

我正在尝试找出如何在多个列中计算值。 似乎我做的第一次计数给出了正确的结果,但是我试图得到的第二次列计数给出了错误的结果。 例如,对于以下两列

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个二等等

然而,下面给了我一个意想不到的结果

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