【问题标题】:While display group of table value in mysql it shows each and every value as '0'在mysql中显示表值组时,它将每个值都显示为“0”
【发布时间】:2020-03-31 09:36:53
【问题描述】:

我的桌子

mysql> desc attendance;
+--------+------------+------+-----+---------+----------------+
| Field  | Type       | Null | Key | Default | Extra          |
+--------+------------+------+-----+---------+----------------+
| aid    | bigint(20) | NO   | PRI | NULL    | auto_increment |
| sid    | int(10)    | YES  | MUL | NULL    |                |
| cid    | bigint(20) | YES  | MUL | NULL    |                |
| ttid   | bigint(20) | YES  | MUL | NULL    |                |
| did    | int(3)     | YES  | MUL | NULL    |                |
| date   | date       | YES  |     | NULL    |                |
| hour   | varchar(3) | YES  |     | NULL    |                |
| stuid  | bigint(20) | YES  | MUL | NULL    |                |
| status | varchar(8) | YES  |     | NULL    |                |
+--------+------------+------+-----+---------+----------------+
9 rows in set (0.47 sec)

它的价值是

mysql> select * from attendance;
+-----+------+------+------+------+------------+------+-------+---------+
| aid | sid  | cid  | ttid | did  | date       | hour | stuid | status  |
+-----+------+------+------+------+------------+------+-------+---------+
|   1 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    16 | present |
|   2 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    17 | absent  |
|   3 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    18 | present |
|   4 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    19 | absent  |
|   5 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    20 | present |
|   6 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    15 | absent  |
|   7 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    16 | present |
|   8 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    17 | absent  |
|   9 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    18 | present |
|  10 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    19 | absent  |
|  11 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    20 | present |
|  12 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    15 | absent  |
|  13 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    16 | present |
|  14 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    17 | present |
|  15 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    18 | present |
|  16 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    19 | present |
|  17 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    20 | present |
|  18 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    15 | present |
|  19 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    16 | absent  |
|  20 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    17 | absent  |
|  21 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    18 | present |
|  22 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    19 | present |
|  23 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    20 | present |
|  24 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    15 | absent  |
+-----+------+------+------+------+------------+------+-------+---------+
24 rows in set (0.00 sec)

现在,我要对表进行分组,但返回值为 0 在对表进行分组时,它返回的每一列值都返回 0。 为什么会这样。我需要在场或不在场,而不是 0。 谁能解决这个逻辑错误?

【问题讨论】:

  • 不要将代码作为图片发布!将文本粘贴到问题中。
  • 对于 SQL 问题,如果您以一种我们可以创建表的方式显示架构,如果可能的话,在本地使用测试数据来测试答案,这将非常有用。所以尝试SHOW CREATE TABLE YourTableName; 并将输出复制/粘贴到您的问题中
  • 您的查询仍然无效。 GROUP BY 中没有很多列,也没有对它们应用聚合函数。旧的 MySQL 版本或配置错误的版本允许这样做,但可能会产生随机的、不需要的结果。

标签: mysql sql date sum pivot


【解决方案1】:

sum(case when hour = 'P1' then status else 'null' end) p1

问题是你在求和数字和 文字字符串 'null'.

您想要null(不带引号)- 或者更好的是0

sum(case when hour = 'p1' then status else 0 end) p1

请注意,在 MySQL 中,在数字上下文中将真/假条件评估为 1/0,这允许将表达式缩短为:

sum(hour = 'p1') p1

【讨论】:

  • 显示相同的结果
  • @TECHNOSUBBU:注意大小写。您的数据是小写的(p1),但您的某些表达式似乎是大写的(P1)。
  • 它返回 0/1 但我需要 'present' 或 'absent' 而不是 1/0
  • 好的,我看了并转换为小写谢谢。请解决以上评论
【解决方案2】:
create view attendance1 as(
select attendance.stuid,
case when hour="p1" then status end as p1,
case when hour="p2" then status end as p2,
case when hour="p3" then status end as p3,
case when hour="p4" then status end as p4,
case when hour="p5" then status end as p5,
case when hour="p6" then status end as p6,
case when hour="p7" then status end as p7,
case when hour="p8" then status end as p8
from attendance);

select * from attendance1;

mysql> select * from attendance1;
+-----+------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+---------+------+---------+
| aid | sid  | cid  | ttid | did  | date       | hour | stuid | status  | p1      | p2      | p3   | p4   | p5   | p6      | p7   | p8      |
+-----+------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+---------+------+---------+
|   1 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    16 | present | present | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   2 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    17 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   3 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    18 | present | present | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   4 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    19 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   5 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    20 | present | present | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   6 |    2 |   13 |    4 |    3 | 2020-03-25 | p1   |    15 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL    | NULL | NULL    |
|   7 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    16 | present | NULL    | NULL    | NULL | NULL | NULL | present | NULL | NULL    |
|   8 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    17 | absent  | NULL    | NULL    | NULL | NULL | NULL | absent  | NULL | NULL    |
|   9 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    18 | present | NULL    | NULL    | NULL | NULL | NULL | present | NULL | NULL    |
|  10 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    19 | absent  | NULL    | NULL    | NULL | NULL | NULL | absent  | NULL | NULL    |
|  11 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    20 | present | NULL    | NULL    | NULL | NULL | NULL | present | NULL | NULL    |
|  12 |    2 |   13 |    2 |    2 | 2020-03-17 | p6   |    15 | absent  | NULL    | NULL    | NULL | NULL | NULL | absent  | NULL | NULL    |
|  13 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    16 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  14 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    17 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  15 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    18 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  16 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    19 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  17 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    20 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  18 |    2 |   13 |    4 |    3 | 2020-03-25 | p2   |    15 | present | NULL    | present | NULL | NULL | NULL | NULL    | NULL | NULL    |
|  19 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    16 | absent  | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | absent  |
|  20 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    17 | absent  | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | absent  |
|  21 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    18 | present | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | present |
|  22 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    19 | present | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | present |
|  23 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    20 | present | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | present |
|  24 |    2 |   13 |    4 |    3 | 2020-03-25 | p8   |    15 | absent  | NULL    | NULL    | NULL | NULL | NULL | NULL    | NULL | absent  |
+-----+------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+---------+------+---------+
24 rows in set (0.02 sec)

【讨论】:

    【解决方案3】:

    最后我根据之前的错误找到了解决方案

    create view attendance1 as(
    select attendance.*,
    case when hour="p1" then status end as p1,
    case when hour="p2" then status end as p2,
    case when hour="p3" then status end as p3,
    case when hour="p4" then status end as p4,
    case when hour="p5" then status end as p5,
    case when hour="p6" then status end as p6,
    case when hour="p7" then status end as p7,
    case when hour="p8" then status end as p8
    from attendance);
    
    mysql> select * from attendance1;
    +------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+------+------+------+
    | sid  | cid  | ttid | did  | date       | hour | stuid | status  | p1      | p2      | p3   | p4   | p5   | p6   | p7   | p8   |
    +------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+------+------+------+
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    16 | present | present | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    17 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    18 | present | present | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    19 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    20 | present | present | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p1   |    15 | absent  | absent  | NULL    | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    16 | absent  | NULL    | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    17 | present | NULL    | present | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    18 | absent  | NULL    | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    19 | present | NULL    | present | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    20 | absent  | NULL    | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    |    2 |   13 |    4 |    3 | 2020-04-22 | p2   |    15 | present | NULL    | present | NULL | NULL | NULL | NULL | NULL | NULL |
    +------+------+------+------+------------+------+-------+---------+---------+---------+------+------+------+------+------+------+
    12 rows in set (0.00 sec)
    

    基于第一个视图,我将创建第二个视图

    mysql>
    create view attendance2 as(
    select stuid,
    max(p1)as p1,
    max(p2)as p2,
    max(p3)as p3,
    max(p4)as p4,
    max(p5)as p5,
    max(p6)as p6,
    max(p7)as p7,
    max(p8)as p8
    from attendance1
    group by stuid);
    
    mysql> select * from attendance2;
    +-------+---------+---------+------+------+------+------+------+------+
    | stuid | p1      | p2      | p3   | p4   | p5   | p6   | p7   | p8   |
    +-------+---------+---------+------+------+------+------+------+------+
    |    15 | absent  | present | NULL | NULL | NULL | NULL | NULL | NULL |
    |    16 | present | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    |    17 | absent  | present | NULL | NULL | NULL | NULL | NULL | NULL |
    |    18 | present | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    |    19 | absent  | present | NULL | NULL | NULL | NULL | NULL | NULL |
    |    20 | present | absent  | NULL | NULL | NULL | NULL | NULL | NULL |
    +-------+---------+---------+------+------+------+------+------+------+
    6 rows in set (0.00 sec)
    

    感谢之前回答问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2011-07-23
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      相关资源
      最近更新 更多