1

我有一个具有这种结构的表列:

|------ ID ------|
|-  1.20.10.00  -|
|-  1.20.10.10  -|
|-  1.20.10.20  -|
|-  1.20.20.00  -|
|-  1.20.20.10  -|
|-  1.40.10.00  -|
|-  1.40.20.00  -|
|-  1.60.10.00  -|
|-  1.60.10.00  -|

我正在尝试运行一个查询,该查询将根据字符串返回的不同值将数据转换为多个列,就像值中的 5 个左侧字符一样,列名与 like 语句中使用的 5 个字符匹配。让我举一个我想要达到的例子:

|----- 1.20. ----||----- 1.40. ----||----- 1.60. ----|
|-  1.20.10.00  -||-  1.40.10.00  -||-  1.60.10.00  -|
|-  1.20.10.10  -||-  1.40.20.00  -||-  1.60.10.00  -|
|-  1.20.10.20  -|
|-  1.20.20.00  -|
|-  1.20.20.10  -|

我在 Oracle 11g 数据库上,所以我想我应该使用 PIVOT 命令,但我不知道如何通过添加 DISTINCT 和 LIKE 命令来设置它。任何帮助,将不胜感激。

4

1 回答 1

1

作为选项一,您可以使用row_number() over()分析函数、max()聚合函数和case表达式的组合:

select max(case when substr(col, 1, 4) = '1.20' then col end) as "1.20"
     , max(case when substr(col, 1, 4) = '1.40' then col end) as "1.40"
     , max(case when substr(col, 1, 4) = '1.60' then col end) as "1.60"
 from (select col
            , row_number() over(partition by substr(col, 1, 4) 
                                    order by substr(col, 1, 4)) as rn
        from t1)
group by rn

结果:

1.20       1.40       1.60     
---------- ---------- ----------
1.20.10.00 1.40.10.00 1.60.10.00 
1.20.10.10 1.40.20.00 1.60.10.00 
1.20.20.00                       
1.20.20.10                       
1.20.10.20                       

注意:不是一个好的列别名选择。

作为另一种选择,您可以使用在 Oracle 11g 版本中引入的pivot运算符:

select "1.20"
     , "1.40"
     , "1.60"
       from (select col
                  , substr(col, 1, 4) as common_part
                  , row_number() over(partition by substr(col, 1, 4) 
                                          order by substr(col, 1, 4)) as rn
              from t1)
pivot(
  max(col) for common_part in ( '1.20' as "1.20"
                              , '1.40' as "1.40"
                              , '1.60' as "1.60")
)

结果:

1.20       1.40       1.60     
---------- ---------- ----------
1.20.10.00 1.40.10.00 1.60.10.00 
1.20.10.10 1.40.20.00 1.60.10.00 
1.20.20.00                       
1.20.20.10                       
1.20.10.20                       
于 2013-11-01T18:54:03.353 回答