MySQL 将行转为动态列

如何解决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 Time6​​h>
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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?