【问题标题】:How to convert row values of a column to columns - JDBCTemplate and PostgreSQL如何将列的行值转换为列 - JDBCTemplate 和 PostgreSQL
【发布时间】:2021-04-23 12:39:01
【问题描述】:

我目前有一张桌子:

id | info  | value       | date 
1  | desc  | description | 19-01-1990 10:01:23
2  | lname | Doe         | 19-11-1990 10:01:23
1  | fname | John        | 19-08-1990 10:01:23
1  | dob   | dob         | 19-05-1990 10:01:23
3  | fname | Jo          | 19-01-1990 10:01:23

我想稍后查询和抓取数据并与多个表进行连接,所以我需要它:

id | desc        | lname | fname | dob | desc        | date        | ... |
1  | description | Doe   | John  | dob | description | 19-01-1990 10:01:23 | ... |
2  | .........   | ..... | Jo    |     |             | ...         | ... |

我尝试过交叉表,但它似乎不起作用。任何帮助表示赞赏

【问题讨论】:

  • 您应该包含基于样本输入数据的完整预期输出。特别是,您应该准确地向我们展示date 列的外观。
  • 你还没有回答我的问题。请在输出中包含 date 列的值。
  • 所以你想要每个id 的最早日期?
  • @TimBiegeleisen 我希望获得信息列值,例如desc、lname、fname 作为列,所以一行是一个 id
  • @TimBiegeleisen 我不清楚,但我正在尝试将我的行转换为基于 id 作为键的列

标签: spring spring-boot spring-data spring-jdbc jdbctemplate


【解决方案1】:

您当前的表是典型的非规范化键值存储。您可以通过聚合 id 然后使用 max CASE 表达式来生成您想要的标准化输出:

SELECT
    id,
    MAX(CASE WHEN info = 'desc'  THEN value END) AS desc,
    MAX(CASE WHEN info = 'lname' THEN value END) AS lname,
    MAX(CASE WHEN info = 'fname' THEN value END) AS fname,
    MAX(CASE WHEN info = 'dob'   THEN value END) AS dob
FROM yourTable
GROUP BY
    id
ORDER BY
    id;

请注意,我没有任何日期列,因为您没有为每个id 保留哪个日期值的逻辑。

至于您问题的 Spring 部分,您可能必须使用本机查询来执行上述操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2012-12-14
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多