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

从多列中选择值到单列中

关玄裳
2023-03-14
问题内容

我在数据库中有一个表,该表有9列包含相同种类的数据,这些值 允许为null
。我需要将每个非null值选择到单列的值中,这些值不关心它们源自的行的身份。

因此,对于一个看起来像这样的表:

+---------+------+--------+------+
|   Id    | I1   | I2     | I3   | 
+---------+------+--------+------+
|    1    | x1   | x2     |  x7  |
|    2    | x3   | null   |  x8  |
|    3    | null | null   |  null|
|    4    | x4   | x5     |  null|
|    5    | null | x6     |  x9  |
+---------+------+--------+------+

我希望将每个以x开头的值选择到一列中。我得到的数据应如下表所示。需要保留顺序,因此第一行的第一列值应该在顶部,而最后一行的最后列值应该在底部:

+-------+
| value |
+-------+
|  x1   |
|  x2   |
|  x7   |
|  x3   |
|  x8   |
|  x4   |
|  x5   |
|  x6   |
|  x9   |
+-------+

我正在使用 SQL Server 2008 R2 。是否有比从每行依次选择每一列的值并将非空值插入结果更好的技术呢?


问题答案:

您可以使用UNPIVOT函数获得最终结果:

select value
from yourtable
unpivot
(
  value
  for col in (I1, I2, I3)
) un
order by id, col;

由于您使用的是SQL Server 2008+,因此还可以将CROSS APPLY与VALUES子句一起使用来取消透视列:

select value
from yourtable
cross apply
(
    values
        ('I1', I1),
        ('I2', I2),
        ('I3', I3)
) c(col, value)
where value is not null
order by id, col


 类似资料:
  • 问题内容: 我想编写一个SQL Server查询,该查询将从以下示例表中检索数据: 如您所见,SkillLink表的目的是将各种(可能是多个或没有)技能与单个人员匹配。我想通过查询实现的结果是: 因此,对于每个人,我都希望使用逗号连接的所有指向他的SkillName列表。这可能是多种技能,或者根本没有。 这显然不是我正在使用的实际数据,但是结构是相同的。 也请随时为这个问题建议一个更好的标题作为注

  • 问题内容: 我有一个MySQL表,其中包含以下类型的信息: 这是我用来从该表获取数据的脚本示例: 该脚本显示表格中的每个日期,例如 我只想显示唯一的日期,例如 问题答案: 在MySQL中使用DISTINCT运算符:

  • 问题内容: 考虑下表: 如何编写仅返回 数字 值的select语句 SQLFiddle 问题答案:

  • 问题内容: 我有一个用于“个人档案”的表,以行样式存储个人档案属性值,例如: 和另一个用于属性定义的表: 如何使用或以任何其他方式以这种方式显示它: 问题答案: 不用关键字就可以轻松完成此操作,只需将其分组即可 您也可以使用关键字执行此操作

  • 问题内容: 好的,因此我对其他解决方案没有任何帮助。所以这就是我想要做的。我需要选择多列的行,其中一列的值是最大值。 这是样本数据 我需要选择整行,其中orderfileid是每个唯一商品编号的最大值 返回的数据集应该看起来像 我想我尝试过可以想到的select max(orderfileid)的每种组合 任何帮助都将被申请。谢谢 问题答案: 您需要在子查询中找到MAX值,然后使用这些结果将其连接

  • 作为 LINQ 查询的一部分,我有一系列列,其中只有一列将包含一个值,如何将该单个值分配给变量而不必执行类似操作 类似于这个问题,但用LINQ代替SQL。 不幸的是,用SQL处理数据库端的任何事情都不是一个选项。