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

Oracle SQL-从多行中获取值

高宸
2023-03-14
问题内容

我有一个这样的表:

TABLE: FACTS
ID       KEY         VALUE
1        name        Jeremy
1        height      5'11
1        awesomeness 10
2        name        Mark
2        awesomeness 4
3        height      4'6

因此,(ID,KEY)元组可以视为主键。

我试图返回这样的行:

ID     NAME     HEIGHT    AWESOMENESS
1      Jeremy   5'11      10
2      Mark     (null)    4
3      (null)   4'6       (null)

因此,除了通过对每列进行子选择之外,如何才能抓住键值(如果有的话)并将它们收集到我的单行中?到目前为止,我尝试过的是:

SELECT 
  id,
  CASE WHEN facts.key = 'name' THEN value END name,
  CASE WHEN facts.key = 'height' THEN value END height,
  CASE when facts.key = 'awesomeness' THEN value END awesomeness
FROM
  facts
WHERE
  facts.id in (1,2,3)

但是出于明显的原因,此操作会为每个匹配的键返回一行,而不是每个id返回一行。

我该如何以自己想要的方式进行操作?

谢谢!


问题答案:

您可以在任何版本的Oracle中旋转这样的数据。

SELECT id,
       MAX( CASE WHEN key = 'name' THEN value ELSE null END ) name,
       MAX( CASE WHEN key = 'height' THEN value ELSE null END ) height,
       MAX( CASE WHEN key = 'awesomeness' THEN value ELSE null END ) awesomeness
  FROM facts
 WHERE id IN (1,2,3)
 GROUP BY id

如果您使用的是11g,则也可以使用PVOT运算符

但是,如果这代表了您的数据模型,则这种类型的实体属性数据模型通常效率会很低。你一般会好得多与列了一个表送达nameheightawesomeness,等。



 类似资料:
  • 我有一个大约15万行的表,我必须使用JavaQuartz Scheduler一次获取1000行。要求是一次限制1000行,然后再限制1000行等(与MySQL限制查询相同)。 我正在使用以下查询: 问题是上面的查询返回了我在结果集中不需要的额外列rownum,因为返回的数据被传递给MapListHandler(),后者返回将结果转换为JSON,并且我将此JSON传递给不期望额外rownum列的We

  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • 问题内容: 我在单个SQL语句中从多个表中提取Sums时遇到问题。 我有三个表tblCases,tblTimesheetEntries和tblInvoices在tblCases和其他两个表之间存在一对多的关系。 我目前正在使用以下SQL语句 但是,这似乎重复了发票金额。例如,如果一个案例只有一张发票,但是说有4个时间表条目,则它将计算出发票金额的4倍作为该表的总和。 如果我将分组取出,然后运行以下

  • 嗨,我有两张具有以下结构的表格 学生们 这里,COl1=ID,Col2=Name,Col3=SubjectCode,COl4=Col3中的标记,Col5=subjectCpde,Col6=Col5中的标记 另一个表格叫做主题 这里Col1=主题代码,COl2=学生表中引用的主题名称。 现在我的查询应该返回如下结果。它是如何实现的?

  • 我需要读取excel文件并突出显示重复的行,而不需要编辑excel或添加新的列/行。我使用读取excel文件,并使用读取所有重复行,但不包括'mark4'。问题是,我无法提取这些行号来与一起使用,以突出显示excel中的那些行,因为这些行不包括在DF中。 我试过,但由于没有唯一的行,所以无法提取数据。 的输出为: [6行x170列] 我需要提取那些不属于excel列的行号,并将它们作为列表用于将来

  • 我试图从跨多个工作表的考勤中找到员工ID,并将时间戳拉到单个工作表中。 我在Excel中做过类似的事情,我猜可以在谷歌表格中使用谷歌应用脚本完成。 如果有人能引导我使用谷歌表单中的内置或自定义功能,那将非常有帮助。