当前位置: 首页 > 面试题库 >

SQL-如何转置?

蔚承天
2023-03-14
问题内容

我有类似下表的内容:

================================================
| Id | UserId | FieldName     | FieldValue     |
=====+========+===============+================|
| 1  | 100    | Username      | John Doe       |
|----+--------+---------------+----------------|
| 2  | 100    | Password      | pass123!       |
|----+--------+---------------+----------------|
| 3  | 102    | Username      | Jane           |
|----+--------+---------------+----------------|
| 4  | 102    | Password      | $ecret         |
|----+--------+---------------+----------------|
| 5  | 102    | Email Address | jane@email.com |
------------------------------------------------

我需要一个查询,它会给我这样的结果:

==================================================
| UserId | Username  | Password | Email Address  |
=========+===========+===========================|
| 100    | John Doe  | pass123! |                |
|--------+-----------+----------+----------------|
| 102    | Jane      | $ecret   | jane@email.com |
|--------+-----------+----------+----------------|

请注意,FieldName中的值不限于用户名,密码和电子邮件地址。它们可以是用户定义的任何东西。

有没有办法在SQL中做到这一点?


问题答案:

MySQL不支持ANSI PIVOT / UNPIVOT语法,因此您可以使用:

  SELECT t.userid
         MAX(CASE WHEN t.fieldname = 'Username' THEN t.fieldvalue ELSE NULL END) AS Username,
         MAX(CASE WHEN t.fieldname = 'Password' THEN t.fieldvalue ELSE NULL END) AS Password,
         MAX(CASE WHEN t.fieldname = 'Email Address' THEN t.fieldvalue ELSE NULL END) AS Email
    FROM TABLE t
GROUP BY t.userid

如您所见,需要按值定义CASE语句。要使其动态化,您需要使用MySQL的Prepared Statement(dynamic
SQL)语法



 类似资料:
  • 问题内容: 我正在尝试在SQL Server中执行按位NOT。我想做这样的事情: 注意:我开始写这篇文章,然后在完成之前找到了自己的问题的答案。我仍然想与社区分享,因为MSDN缺少此文档(直到我也将其添加到社区内容中)。 问题答案: 是的,〜运算符将起作用。

  • 问题内容: 我正在寻找与T-SQL相当的db2: 问题答案: 根据《DB2生存指南》,也可以使用两个撇号在DB2上获得单个撇号。那不是对你有用吗?

  • 问题内容: 我所有的时间都在UTC时区,现在我需要以某种方式将其转换为用户时区(我也将其存储在数据库中,并使用Windows时区的ID)。 如何在SQL Server 2005中做到这一点? 编辑 所以我试图做那个扩展的存储过程,但是用Timezoneinfo我得到了这个错误 部署错误SQL01268:.Net SqlClient数据提供程序:消息6503,级别16,状态12,行1程序集’syst

  • 问题内容: 我是Hibernate和HQL的新手。我想在HQL中编写一个更新查询,其SQL等效项如下: 是的PK ,是的FK和PK 。有一对一的映射。 相应的Java类是Patient(患者)(具有lastName,firstName,doctorId字段)和Doctor(具有DoctorId字段)。 谁能告诉我上面的SQL查询的HQL等效项是什么? 非常感谢。 问题答案: 如果您检查规范,则可以

  • 问题内容: 我正在尝试将输出输出为\ a \ b \ c。上面的错误可能是因为我无法转义\字符。 问题答案: 您无需转义反斜杠(仅使用内部单引号):

  • 问题内容: 我正在做这个 它给了我这个 但是我想要这个 请帮忙。 问题答案: 首先将其转换为十进制, SQLFiddle演示