【问题标题】:Oracle SQL group data by valueOracle SQL 按值分组数据
【发布时间】:2015-02-25 22:31:52
【问题描述】:

我有这张桌子:

TABLE_A

ID | ATTR_NAME | ATTR_ID | START_DATE
-------------------------------------
1  | XPTA      | 12      | 01-10-2013
1  | XPTO      | 167     | 01-10-2013
1  | XPTA      | 13      | 04-12-2013
2  | XPTA      | 12      | 03-09-2015
2  | XPTO      | 6       | 05-08-2012

TABLE_B (just to help understand)

ATTR_NAME | ATTR_ID | DESCRIPTION
---------------------------------
XPTA      | 12      | ASM5
XPTO      | 167     | weird attr
XPTA      | 13      | DBSO12
XPTO      | 6       | gosh...

有没有办法让选择返回这个?

ID | XPTA | XPTO | START_DATE
-----------------------------
1  | 12   | 167  | 01-10-2013
1  | 13   |      | 04-12-2013
2  | 12   |      | 03-09-2015
2  |      | 6    | 05-08-2012

基本上,COL1 表示一个属性,COL2 表示与从 START_DATE 开始的 ID 关联的 COL1 的 id 值 示例:资源 Mike (ID) 从 2013 年 1 月 10 日(START_DATE)开始具有 ASM5 (COL2) 的成本配置文件 (COL1)

想法是按日期对每个 ID 的属性进行分组。

我认为我能做到的唯一方法是首先执行 选择不同于 TABLE_A 的 start_date,然后为获取的每个日期执行一个 select ID、COL1、COL2、:date_start from TABLE_A其中 START_DATE = :date_start 然后以某种方式使 COL1 值我的列和 COL2 值我的值。

【问题讨论】:

  • 我假设所需结果的最后一行中的 6 应该在第三列,而不是第二列。
  • 你完全正确。我很抱歉这个错误。已更正。

标签: sql oracle


【解决方案1】:

假设我正确理解了您的问题,您正在寻找条件聚合,您可以使用 maxcase 进行操作:

select id, 
    max(case when attr_name = 'XPTA' then attr_id end) xpta,
    max(case when attr_name = 'XPTO' then attr_id end) xpto,
    start_date
from table_a 
group by id, start_date

【讨论】:

  • 谢谢@sgedded,这比我想象的要简单得多。我仍然觉得这种思路很尴尬,但我想我明白了。
猜你喜欢
  • 2019-09-13
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多