Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 对重复值进行计数,并按id对其求和,以获得一百万条记录_Mysql_Sql_Pivot_Pivot Table - Fatal编程技术网

Mysql 对重复值进行计数,并按id对其求和,以获得一百万条记录

Mysql 对重复值进行计数,并按id对其求和,以获得一百万条记录,mysql,sql,pivot,pivot-table,Mysql,Sql,Pivot,Pivot Table,我有以下问题- 表中有数百万条记录,格式如下- Scale ID 01 2001 01 2001 03 2002 05 2003 78 2011 76 2010 so on .. 量表范围为01-100,ID范围为2001-2011 我想要一个新的表格,从中计算出每年的每个等级 输出应该是这样的 Scale 2001 2002 2003 2004 ---- 2011 1 2 0 0 0

我有以下问题-

表中有数百万条记录,格式如下-

Scale   ID 
01      2001
01      2001
03      2002
05      2003
78      2011
76      2010

so on .. 
量表范围为01-100,ID范围为2001-2011

我想要一个新的表格,从中计算出每年的每个等级

输出应该是这样的

Scale 2001  2002  2003  2004 ---- 2011
1     2      0     0     0   ----  0
2     0      0     0     0  ------ 0
3     0      1     0     0  ------- 0
4     0      0     0     0  ------ 0
5     0      0     1     0  ------ 0
-
-
-
-  
100 
尝试在SQL中执行此操作。 任何帮助都会很好


谢谢

您可以使用条件聚合

  • 比例分组

  • 在列列表中,使用
    大小写
    检查ID是否具有要在该列中显示的值。如果有,则返回任何非空值(例如
    1
    )。将一个
    count()。由于
    count()
    将不计算
    NULL
    s,并且
    CASE
    NULL
    作为默认值返回,当没有其他匹配项时,它将仅计算ID具有相应值的事件

像这样:

SELECT `scale`,
       count(CASE `id`
               WHEN 2001 THEN
                 1
             END) `2001`,
       ...
       count(CASE `id`
               WHEN 2011 THEN
                 1
             END) `2011`
       FROM `elbat`
       GROUP BY `scale`
       ORDER BY `scale`;

您可以使用条件聚合

  • 比例分组

  • 在列列表中,使用
    大小写
    检查ID是否具有要在该列中显示的值。如果有,则返回任何非空值(例如
    1
    )。将一个
    count()。由于
    count()
    将不计算
    NULL
    s,并且
    CASE
    NULL
    作为默认值返回,当没有其他匹配项时,它将仅计算ID具有相应值的事件

像这样:

SELECT `scale`,
       count(CASE `id`
               WHEN 2001 THEN
                 1
             END) `2001`,
       ...
       count(CASE `id`
               WHEN 2011 THEN
                 1
             END) `2011`
       FROM `elbat`
       GROUP BY `scale`
       ORDER BY `scale`;

如果你使用的是MySQL,你需要用很难的方法来实现它

SELECT scale, 
    SUM(CASE WHEN id=2001 THEN 1 ELSE 0) AS `2001`,
    SUM(CASE WHEN id=2002 THEN 1 ELSE 0) AS `2002`,
    SUM(CASE WHEN id=2003 THEN 1 ELSE 0) AS `2003`,
    ...
    SUM(CASE WHEN id=2011 THEN 1 ELSE 0) AS `2011`
FROM mytable
GROUP BY scale

如果你使用的是MySQL,你需要用很难的方法来实现它

SELECT scale, 
    SUM(CASE WHEN id=2001 THEN 1 ELSE 0) AS `2001`,
    SUM(CASE WHEN id=2002 THEN 1 ELSE 0) AS `2002`,
    SUM(CASE WHEN id=2003 THEN 1 ELSE 0) AS `2003`,
    ...
    SUM(CASE WHEN id=2011 THEN 1 ELSE 0) AS `2011`
FROM mytable
GROUP BY scale

@Earthshaker请记住,
COUNT()
只能处理数字数据。。不能处理像“abc”或datetimes日期类型这样的字符串。@RaymondNijland:你这是什么意思
count()<代码>
此处需要为数字,不能为其他数据类型。。对于马克斯,你没有这个问题。@RaymondNijland:没有。您也可以使用
'1'
而不是
1
'I'm not null!'
或任何表达式,只要它不是文本
NULL
或计算结果为
NULL
“不,它不是”我想你不明白我在这里的意思,请检查此
计数(当1=1时,则“a”其他“a”结束)
不会给出“a”,而是1。。这就是为什么我总是建议使用MAX,因为它适用于您想要返回的anny数据类型。。但由于MySQL自动广播,您可以使用“1”作为返回值。@Earthshaker请记住,
COUNT()
只能处理数字数据。。不能处理像“abc”或datetimes日期类型这样的字符串。@RaymondNijland:你这是什么意思
count()<代码>
此处需要为数字,不能为其他数据类型。。对于马克斯,你没有这个问题。@RaymondNijland:没有。您也可以使用
'1'
而不是
1
'I'm not null!'
或任何表达式,只要它不是文本
NULL
或计算结果为
NULL
“不,它不是”我想你不明白我在这里的意思,请检查此
计数(当1=1时,则“a”其他“a”结束)
不会给出“a”,而是1。。这就是为什么我总是建议使用MAX,因为它适用于您想要返回的anny数据类型。。但由于MySQL autocast,您可以使用“1”作为返回值。“如果您使用的是mysqlThank@RaymondNijland,您已经更新了答案。感谢您的帮助-在上面的问题中,让我们假设像ID这样的其他列很少&它们的值与ID类似-我如何对所有列执行相同的过程?”?我希望我不需要为它们编写多个SQL语句。我在这里寻找某种循环解决方案。@Earthshaker可能是的。我怀疑您需要一个存储过程来执行循环(而不是手工编写所有这些查询)。对于另一个问题来说,这是一个足够大的话题。“如果您使用的是mysqlThank@RaymondNijland,您已经更新了答案。感谢您的帮助-在上面的问题中,让我们假设像ID这样的其他列很少&它们的值与ID类似-我如何对所有列执行相同的过程?”?我希望我不需要为它们编写多个SQL语句。我在这里寻找某种循环解决方案。@Earthshaker可能是的。我怀疑您需要一个存储过程来执行循环(而不是手工编写所有这些查询)。对于另一个问题来说,这是一个足够大的主题。链接重复问题在mysql中有静态和动态数据透视的答案。链接重复问题在mysql中有静态和动态数据透视的答案。