如何解决MySQL 将行转为动态列
我们有一个包含人员进出记录的表格,如下所示:
人 | 日 | 时间 |
---|---|---|
1 | 02/21/2021 | 08:10 |
2 | 02/21/2021 | 08:11 |
1 | 02/21/2021 | 08:45 |
1 | 02/21/2021 | 09:18 |
1 | 02/21/2021 | 10:45 |
7 | 02/21/2021 | 10:53 |
2 | 02/21/2021 | 17:06 |
1 | 02/21/2021 | 17:23 |
7 | 02/21/2021 | 17:31 |
1 | 02/22/2021 | 08:13 |
5 | 02/22/2021 | 08:19 |
2 | 02/22/2021 | 08:20 |
2 | 02/22/2021 | 08:23 |
5 | 02/22/2021 | 09:47 |
5 | 02/22/2021 | 11:03 |
5 | 02/22/2021 | 18:06 |
5 | 02/22/2021 | 19:08 |
2 | 02/22/2021 | 19:01 |
5 | 02/22/2021 | 22:37 |
5 | 02/23/2021 | 08:15 |
1 | 02/23/2021 | 08:15 |
1 | 02/23/2021 | 14:30 |
5 | 02/23/2021 | 17:05 |
有了这些数据,我们要选择它们如下:
人 | 日 | Time1 | Time2 | Time3 | Time4 | Time5 | Time6h> |
---|---|---|---|---|---|---|---|
1 | 02/21/2021 | 08:10 | 08:45 | 09:18 | 10:45 | 17:23 | |
2 | 02/21/2021 | 08:11 | 17:06 | ||||
7 | 02/21/2021 | 10:53 | 17:31 | ||||
1 | 02/22/2021 | 08:13 | |||||
2 | 02/22/2021 | 08:20 | 08:23 | 19:01 | |||
5 | 02/22/2021 | 08:19 | 09:47 | 11:03 | 18:06 | 19:08 | 22:37 |
1 | 02/23/2021 | 08:15 | 14:30 | ||||
5 | 02/23/2021 | 08:15 | 17:05 |
解决方法
最简单的解决方案不是在 SQL 中执行此操作,而是使用简单查询获取所有数据:
//...
cin >> num1 >> num2;
} while (!cin || num1 < 2);
}
然后编写应用程序代码,以您想要的方式将其呈现在网格中。
这在 SQL 中很棘手的原因是 SQL 要求您在准备查询之前拼出选择列表中的所有列。那是在它有机会读取数据以了解次数最多的人有多少列之前。
在 SQL 中无法通过读取数据并根据读取数据时发现的内容将更多列附加到选择列表来生成“动态列”。
所以在 SQL 中进行数据透视的方法是您首先必须知道有多少列。
SELECT person,day,time FROM WeHaveATable ORDER BY day,person,time;
然后形成一个查询,使用窗口函数对每人/天的行进行编号,并在数据透视表查询中使用它,每次使用一列,最多为您在前一个查询中获得的最大次数.
SELECT MAX(c) FROM (SELECT COUNT(*) FROM WeHaveATable GROUP BY person) AS t;
如果这看起来像是很多令人困惑、一丝不苟的工作,那么您是对的。这就是为什么建议跳过在 SQL 中解决这个问题的原因。执行我在顶部显示的简单查询,然后编写应用程序代码,按照您的需要将结果处理到网格中。
,有关列需求的数据驱动列表,请参阅 http://mysql.rjweb.org/doc.php/pivot
它构建 SELECT
并可选择运行它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。