SQL 按固定值列表分组
SQL Group by fixed list of values
如果我有两列:
col1 col2 amount
1 2 15
2 3 12
1 3 10
3 1 4
3 2 3
然后我按 col1、col2 执行分组,然后我为数据中的每个组合(存在)获得一行。
虽然我的问题是,我并不总是拥有所有组合,但我仍想 return 每个组合的一行。所以如果没有组合。例如 2 -> 1 那么我希望它的值为 0.
我能以某种方式指定组的 "levels" 吗?
我正在使用 SQL Oracle。
我想要的结果是:
1 -> 2 15
1 -> 3 10
2 -> 1 0
2 -> 3 12
3 -> 1 4
3 -> 2 3
用它们各自的数量,如果它们不存在则为0,或者为空。 (我有一个过滤器可以排除 col1 和 col2 相同的地方)
使用 cross join
生成所有行,然后筛选出您想要的行:
select c1.col1, c2.col2, coalesce(t.amount, 0)
from (select 1 as co1l from dual union all
select 2 as co1l from dual union all
select 3 as co1l from dual
) c1 cross join
(select 1 as co12 from dual union all
select 2 as co12 from dual union all
select 3 as co12 from dual
) c2 left join
t
on t.col1 = c1.col1 and t.col2 = c2.col2
where c1.col1 <> c2.col2;
如果我有两列:
col1 col2 amount
1 2 15
2 3 12
1 3 10
3 1 4
3 2 3
然后我按 col1、col2 执行分组,然后我为数据中的每个组合(存在)获得一行。
虽然我的问题是,我并不总是拥有所有组合,但我仍想 return 每个组合的一行。所以如果没有组合。例如 2 -> 1 那么我希望它的值为 0.
我能以某种方式指定组的 "levels" 吗?
我正在使用 SQL Oracle。
我想要的结果是:
1 -> 2 15
1 -> 3 10
2 -> 1 0
2 -> 3 12
3 -> 1 4
3 -> 2 3
用它们各自的数量,如果它们不存在则为0,或者为空。 (我有一个过滤器可以排除 col1 和 col2 相同的地方)
使用 cross join
生成所有行,然后筛选出您想要的行:
select c1.col1, c2.col2, coalesce(t.amount, 0)
from (select 1 as co1l from dual union all
select 2 as co1l from dual union all
select 3 as co1l from dual
) c1 cross join
(select 1 as co12 from dual union all
select 2 as co12 from dual union all
select 3 as co12 from dual
) c2 left join
t
on t.col1 = c1.col1 and t.col2 = c2.col2
where c1.col1 <> c2.col2;