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()
s,并且NULL
将CASE
作为默认值返回,当没有其他匹配项时,它将仅计算ID具有相应值的事件NULL
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()
s,并且NULL
将CASE
作为默认值返回,当没有其他匹配项时,它将仅计算ID具有相应值的事件NULL
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中有静态和动态数据透视的答案。