SQL查询列列表键有/无布尔值

时间:2016-12-16 11:31:46

标签: sql oracle

想象一下,我有一张如下表:

|-----|-------|
| KEY | VALUE |
|-----|-------|
| A   | 0     |
| B   | 1     |
| C   | 0     |
|-----|-------|

我想做的是执行一个SQL查询,它会给我一个如下表:

|---------------|------------|
| Without Value | With Value |
|---------------|------------|
| A             | B          |
| C             |            |
|---------------|------------|

所以A列是Active = 1而B列是Active = 0的地方。但我的SQL是基本的,我不知道如何实现这一点(如果它可能的话)。有人有什么想法吗?

这在Oracle DB上。

3 个答案:

答案 0 :(得分:4)

您可以使用带有值的键列表与不带值的键之间的完全外部联接来执行此操作:

select no_val.key as "Without value", with_val.key as "With Value"
from (
    select key, row_number() over (order by key) as rn
    from kv
    where value = 0
 ) no_val
 full outer join (
    select key, row_number() over (order by key) as rn
    from kv
    where value = 1
 ) with_val 
 on no_val.rn = with_val.rn;

在线示例:http://rextester.com/RMKRRA65292

答案 1 :(得分:1)

您可以通过使用ROW_NUMBER()分析函数为每一行提供索引,然后使用PIVOT

,而无需重新进行自联接。
SELECT Without_Value, With_Value
FROM   ( SELECT t.*,
                ROW_NUMBER() OVER ( PARTITION BY Value ORDER BY ROWNUM ) AS idx
         FROM   table_name t )
PIVOT  ( MAX( Key ) FOR Value IN ( 0 AS Without_Value, 1 AS With_Value ) );

<强>输出

WITHOUT_VALUE WITH_VALUE
------------- ----------
A             B
C

答案 2 :(得分:0)

这应该有帮助

select case when value=0 then key else null end as "Without Value",case when value=1 then key else null end as "With Value" from key_value