多行到列(SQL)

时间:2018-07-16 07:31:11

标签: sql oracle

我当前正在一个数据库中工作,该数据库的表如下所示:

ID    | Type   | Value
11111 | Type1 | 45
11111 | Type2 | 85
11111 | Type3 | 26
11111 | Type4 | 69
11112 | Type1 | 14
11112 | Type2 | 36
11113 | Type1 | 69
11113 | Type3 | 25

此表的工作方式如下:

每个ID在表中多次出现。 每个ID具有一种或多种类型。 每种类型都有一个值

在上面的示例中,您可以看到ID 11112没有Type3或Type4,并且ID 11113没有Type2或Type4。

此问题是每个ID都应存在某些类型(具有相应的值),为实现此目的,应创建一个列表,其中包含所有缺少这些类型中一个或多个的ID。这样一来,很容易就能看到需要什么ID的类型和附加值。

是否存在可以列出此类列表的查询?给出缺少一个或多个类型的每个实例的唯一ID的代码吗?我只能获取缺少特定类型的ID,但是我无法做到这一点,因此缺少任何类型的ID都会被列出。

3 个答案:

答案 0 :(得分:0)

此查询显示至少缺少一种类型的所有ID:

SELECT ID 
FROM T
GROUP BY ID 
HAVING COUNT(DISTINCT TYPE)<(SELECT COUNT(DISTINCT TYPE) FROM T)

答案 1 :(得分:0)

不是很优雅,但是会返回缺少的ID和类型。我从ID中删除了多余的“ 1111”,从类型中删除了“ ype”(太懒了,无法全部输入)。

SQL> with test (id, type) as
  2    (select 1, 't1' from dual union all
  3     select 1, 't2' from dual union all
  4     select 1, 't3' from dual union all
  5     select 1, 't4' from dual union all
  6     --
  7     select 2, 't1' from dual union all
  8     select 2, 't2' from dual union all
  9     --
 10     select 3, 't1' from dual union all
 11     select 3, 't3' from dual
 12    ),
 13  all_types as
 14    (select distinct type from test)
 15  --
 16  select t.id, a.type
 17  from test t join all_types a on 1 = 1
 18  minus
 19  select t.id, t.type
 20  from test t;

        ID TY
---------- --
         2 t3
         2 t4
         3 t2
         3 t4

SQL>

答案 2 :(得分:0)

您可以生成所有必需的类型和ID组合,然后过滤掉现有的类型和ID:

with required_types as (
      select 'type3' as type from dual union all
      select 'type4' as type from dual
     )
select i.id, rt.type
from (select distinct id from t) i cross join
     required_types rt left join
     t
     on t.id = i.id and t.type = rt.type
where t.id is null;

如果数据中存在的所有类型都是必需的,则可以使用{{1} }。