每天SQL计数值返回错误

时间:2017-05-09 08:07:23

标签: mysql sql

我有这个数据集

dia valor valor_b
=== ===== =======
1    1     b1
1    2     b2
1    1     b3
1    2     b3
2    1     b2
2    3     b1
2    1     b1
2    1     b1
2    1     b2
1    3     b3
5    1     b4
5    3     b1

我需要计算每天valor_b出现的次数。并在这个结构中显示:

valor dia_1 dia_2 dia_3 dia_4 dia_5
===== ===== ===== ===== ===== =====
1     2     4     0     0     1
2     2     0     0     0     0
3     1     1     0     0     1

我第一次这样做是为了显示value_b

SELECT valor, 
  group_concat(DISTINCT IF(dia=1, valor_b, NULL)) dia_1,
  group_concat(DISTINCT IF(dia=2, valor_b, NULL)) dia_2,
  group_concat(DISTINCT IF(dia=3, valor_b, NULL)) dia_3,
  group_concat(DISTINCT IF(dia=4, valor_b, NULL)) dia_4,
  group_concat(DISTINCT IF(dia=5, valor_b, NULL)) dia_5
FROM test
GROUP BY valor;

但现在计算valor_b phpmyadmin 会返回此错误

  

1111 - 无效使用群组功能

这是用过的句子

SELECT valor, 
      group_concat(DISTINCT IF(dia=1, count(valor_b), NULL)) dia_1,
      group_concat(DISTINCT IF(dia=2, count(valor_b), NULL)) dia_2,
      group_concat(DISTINCT IF(dia=3, count(valor_b), NULL)) dia_3,
      group_concat(DISTINCT IF(dia=4, count(valor_b), NULL)) dia_4,
      group_concat(DISTINCT IF(dia=5, count(valor_b), NULL)) dia_5
    FROM test
    GROUP BY valor;

3 个答案:

答案 0 :(得分:1)

我在结果中看不到连接的字符串。那么为什么要使用GROUP_CONCAT呢?不要只是想要:

select
  valor,
  sum(dia = 1) as dia_1,
  sum(dia = 2) as dia_2,
  sum(dia = 3) as dia_3,
  sum(dia = 4) as dia_4,
  sum(dia = 5) as dia_5
from test
group by valor
order by valor;

这在MySQL中使用了true = 1和false = 0.

我不确定"I need count how many times appear valor_b per day"究竟是什么意思。计算valor_b不为空的记录?然后,您必须将其添加到表达式中:

  sum(dia = 1 and valor_b is not null) as dia_1,

答案 1 :(得分:1)

如果我告诉你的话

SELECT valor, 
      sum(IF(dia=1, 1, NULL)) dia_1,
      sum(IF(dia=2, 1, NULL)) dia_2,
      sum(IF(dia=3, 1, NULL)) dia_3,
      sum(IF(dia=4, 1, NULL)) dia_4,
      sum(IF(dia=5, 1, NULL)) dia_5
    FROM test
    GROUP BY valor;

答案 2 :(得分:1)

你在这里不需要group_concat,仅sum就足够了

SELECT  valor, 
        sum(IF(dia=1, 1, 0)) dia_1,
        sum(IF(dia=2, 1, 0)) dia_2,
        sum(IF(dia=3, 1, 0)) dia_3,
        sum(IF(dia=4, 1, 0)) dia_4,
        sum(IF(dia=5, 1, 0)) dia_5
FROM    test
GROUP BY valor