首页 > 解决方案 > 如何水平显示某个月份的所有日期?

问题描述

我将 postgreSQL 名称中的数据库表命名为“时间”,例如:

|  Name  |  |    Date1   | |AttendHour1| |    Date2   | |AttendHour2|
---------------------------------------------------------------------
| Zakir1 |  | 2018-10-01 | |   8.00    | | 2018-10-02 | |   8.00    |
| Zakir2 |  | 2018-10-01 | |   9.00    | | 2018-10-02 | |   9.00    |
| Zakir3 |  | 2018-10-01 | |   7.00    | | 2018-10-02 | |   7.00    | 

从这张表中,我想要这样的结果..

|  Name  | | 2018-10-01 | | 2018-10-02 |
----------------------------------------
| Zakir1 | |   8.00     | |   8.00     |
| Zakir2 | |   9.00     | |   9.00     |
| Zakir3 | |   7.00     | |   7.00     |

什么是 postgreSQL 查询?

标签: sqlpostgresql-9.1

解决方案


就目前而言,您甚至不需要crosstab()对此进行查询。只是:

SELECT name, AttendHour1 AS "2018-10-01", AttendHour2 AS "2018-10-02"
FROM   time;

如果您希望从列动态分配列:这是不可能的。SQL 不允许动态列名。您需要一个两步工作流程:

1. 动态创建查询字符串。

要生成上述查询:

SELECT format('SELECT name, AttendHour1 AS %I, AttendHour2 AS %I FROM time'
             , date1, date2)
FROM   time
LIMIT  1;
2. 执行查询。

推荐阅读