缺少组的SQL pad查询结果
假设下表: 表a:缺少组的SQL pad查询结果,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,假设下表: 表a: ID GroupName SomeValue 1 C 1 2 C 1 2 B 1 2 A 1 我需要构造一个选择以下结果的查询: ID GroupName SomeValue 1 C 1 1 B 0 1 A 0 2 C 1 2 B 1 2 A 1 GroupName实际上
ID GroupName SomeValue
1 C 1
2 C 1
2 B 1
2 A 1
我需要构造一个选择以下结果的查询:
ID GroupName SomeValue
1 C 1
1 B 0
1 A 0
2 C 1
2 B 1
2 A 1
GroupName实际上是从TableA列的大小写表达式派生的,只能接受3个值:A、B、C
解析函数是我们要走的路吗
编辑
很抱歉,没有提及它,但是ID可以由多个列组成。考虑这个例子:
ID1 ID2 GroupName SomeValue
1 1 C 1
1 2 C 1
2 2 C 1
2 2 B 1
2 2 A 1
对于每个唯一的组合ID1+ID2,我需要用0填充一些值。所以结果应该是这样的:
ID1 ID2 GroupName SomeValue
1 1 C 1
1 1 B 0
1 1 A 0
1 2 C 1
1 2 B 0
1 2 A 0
2 2 C 1
2 2 B 1
2 2 A 1
编辑2
看起来像是@Laurence提出的解决方案,即使对多个列“ID”也应该有效。我无法重写@Nicholas Krasnov提出的查询以符合此要求。但有人能从性能角度比较这些解决方案吗?分析函数是否比“交叉连接+左外部连接”工作得更快?为了填补空白,您可以使用外部连接的partition by子句编写类似的查询:
SQL> with t1(ID,GroupName,SomeValue) as
2 (
3 select 1, 'C', 1 from dual union all
4 select 2, 'C', 1 from dual union all
5 select 2, 'B', 1 from dual union all
6 select 2, 'A', 1 from dual
7 ),
8 groups(group_name) as(
9 select 'A' from dual union all
10 select 'B' from dual union all
11 select 'C' from dual
12 )
13 select t1.ID
14 , g.group_name
15 , nvl(SomeValue, 0) SomeValue
16 from t1
17 partition by (t1.Id)
18 right outer join groups g
19 on (t1.GroupName = g.group_name)
20 order by t1.ID asc, g.group_name desc
21 ;
ID GROUP_NAME SOMEVALUE
---------- ---------- ----------
1 C 1
1 B 0
1 A 0
2 C 1
2 B 1
2 A 1
6 rows selected
更新:对评论的回应
在partition by子句中也指定ID2列:
SQL> with t1(ID1, ID2, GroupName,SomeValue) as
2 (
3 select 1, 1, 'C', 1 from dual union all
4 select 1, 2, 'C', 1 from dual union all
5 select 2, 2, 'C', 1 from dual union all
6 select 2, 2, 'B', 1 from dual union all
7 select 2, 2, 'A', 1 from dual
8 ),
9 groups(group_name) as(
10 select 'A' from dual union all
11 select 'B' from dual union all
12 select 'C' from dual
13 )
14 select t1.ID1
15 , t1.ID2
16 , g.group_name
17 , nvl(SomeValue, 0) SomeValue
18 from t1
19 partition by (t1.Id1, t1.Id2)
20 right outer join groups g
21 on (t1.GroupName = g.group_name)
22 order by t1.ID1, t1.ID2 asc , g.group_name desc
23 ;
ID1 ID2 GROUP_NAME SOMEVALUE
---------- ---------- ---------- ----------
1 1 C 1
1 1 B 0
1 1 A 0
1 2 C 1
1 2 B 0
1 2 A 0
2 2 C 1
2 2 B 1
2 2 A 1
9 rows selected
为了填补空白,您可以使用外部联接的partition by子句编写类似的查询:
SQL> with t1(ID,GroupName,SomeValue) as
2 (
3 select 1, 'C', 1 from dual union all
4 select 2, 'C', 1 from dual union all
5 select 2, 'B', 1 from dual union all
6 select 2, 'A', 1 from dual
7 ),
8 groups(group_name) as(
9 select 'A' from dual union all
10 select 'B' from dual union all
11 select 'C' from dual
12 )
13 select t1.ID
14 , g.group_name
15 , nvl(SomeValue, 0) SomeValue
16 from t1
17 partition by (t1.Id)
18 right outer join groups g
19 on (t1.GroupName = g.group_name)
20 order by t1.ID asc, g.group_name desc
21 ;
ID GROUP_NAME SOMEVALUE
---------- ---------- ----------
1 C 1
1 B 0
1 A 0
2 C 1
2 B 1
2 A 1
6 rows selected
更新:对评论的回应
在partition by子句中也指定ID2列:
SQL> with t1(ID1, ID2, GroupName,SomeValue) as
2 (
3 select 1, 1, 'C', 1 from dual union all
4 select 1, 2, 'C', 1 from dual union all
5 select 2, 2, 'C', 1 from dual union all
6 select 2, 2, 'B', 1 from dual union all
7 select 2, 2, 'A', 1 from dual
8 ),
9 groups(group_name) as(
10 select 'A' from dual union all
11 select 'B' from dual union all
12 select 'C' from dual
13 )
14 select t1.ID1
15 , t1.ID2
16 , g.group_name
17 , nvl(SomeValue, 0) SomeValue
18 from t1
19 partition by (t1.Id1, t1.Id2)
20 right outer join groups g
21 on (t1.GroupName = g.group_name)
22 order by t1.ID1, t1.ID2 asc , g.group_name desc
23 ;
ID1 ID2 GROUP_NAME SOMEVALUE
---------- ---------- ---------- ----------
1 1 C 1
1 1 B 0
1 1 A 0
1 2 C 1
1 2 B 0
1 2 A 0
2 2 C 1
2 2 B 1
2 2 A 1
9 rows selected
谢谢!你认为这应该比交叉连接+左外连接解决方案快吗?@jFrenetic是的,至少因为I/O的减少。你应该自己测试它。执行查询,查看解释计划。您应该始终自己测试它。我同意你的看法。只是我现在没有工作环境。我一定会尽快测试的。非常感谢!我希望这会比我的解决方案更快,因为它是专门为此设计的功能。如果你做了测试,知道就好了。@Laurence我会告诉你的。查询本身运行良好。我只是想知道,通过外部连接技巧,神奇的Oracle在这个分区背后做了什么:非常感谢!你认为这应该比交叉连接+左外连接解决方案快吗?@jFrenetic是的,至少因为I/O的减少。你应该自己测试它。执行查询,查看解释计划。您应该始终自己测试它。我同意你的看法。只是我现在没有工作环境。我一定会尽快测试的。非常感谢!我希望这会比我的解决方案更快,因为它是专门为此设计的功能。如果你做了测试,知道就好了。@Laurence我会告诉你的。查询本身运行良好。我只是想知道神奇的Oracle通过外部连接技巧在这个分区后面做了什么: