【问题标题】:Counting repeated values and summing them up by id for million records [duplicate]计算重复值并按 id 对数百万条记录求和 [重复]
【发布时间】:2018-08-25 23:52:14
【问题描述】:

我有以下问题 -

具有以下格式的数百万条记录的表 -

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 中执行此操作。 任何帮助都会很棒。

谢谢

【问题讨论】:

  • 链接的重复问题有 mysql 中静态和动态旋转的答案。

标签: mysql sql pivot pivot-table


【解决方案1】:

您可以使用条件聚合。

  • 按scale分组。

  • 在列列表中,使用CASE 检查 ID 是否具有您希望在该列中显示的值。如果有,返回任何非空值(例如1)。在它周围包裹一个count()。由于count()不会计算NULLs,而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`;

【讨论】:

  • @Earthshaker 请记住,COUNT() 只能处理数字数据。而不能处理像 'abc' 或 datetimes 日期类型这样的字符串。
  • @RaymondNijland:你这是什么意思? count() 接受任何类型作为参数,因为它只检查 NULL 与否,它不关心它是数字还是字符串或其他任何类型。
  • “你这是什么意思?”使用 count(CASE id WHEN 2011 THEN 1 END) 2011 然后 THEN <datatype> 和 THEN <datatype> .. <datatype> 在这里必须是数字,它不能是其他数据类型。使用 MAX 就没有这个问题。
  • @RaymondNijland:不,它没有。您也可以使用'1' 代替1 或'I''m not null!' 或任何表达式,只要它不是文字NULL 或计算结果为NULL。
  • “不,它没有”我不认为你明白我的意思在这里检查这个sqlfiddle.com/#!9/d76e50/82 COUNT(CASE WHEN 1=1 THEN 'a' ELSE 'a' END) 不给'a'而是1..这就是为什么我总是建议使用MAX而是因为它适用于您要返回的 anny 数据类型。但是由于 MySQL 自动转换,您可以使用 '1' 作为返回值。
【解决方案2】:

如果您使用的是 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
  • 感谢@RaymondNijland 更新了答案。
  • 感谢您的帮助 - 在上述问题中,我们可以说像 ID 这样的其他列很少,并且它们具有类似 ID 的值 - 我如何对所有列执行相同的过程?我希望我不需要为他们编写多个 SQL 语句。我在这里寻找某种循环解决方案。
  • @Earthshaker 可能是的。我怀疑您将需要一个存储过程来执行循环(而不是手动编写所有这些查询)。对于另一个问题来说,这是一个足够大的话题。
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2016-09-05
  • 2011-01-13
  • 2013-09-08
相关资源
最近更新 更多