动态转置表格

时间:2016-07-07 12:11:13

标签: sql db2 zos

我正在试图弄清楚如何转置结果数据。这是DB2 Z / OS,我们正在运行第11版。

我将始终指定表A(截至目前约有30列,但此处只有三列):

Table A
Column_name    Column_id  Data_type  NULL
Product_id         1         N        N
Product_name       2         A        N
Product_status     3         A        Y

然后表B的大小可能会有所不同。

Table B
Product_id  Product_name  Product_status
  101        'First'           NULL
  102        'Second'        'Inactive'
  103        'Third'         'Active'

我想要的是以下内容:

Result table
Product_number  Column_number   Num_value   Alpha_value   Is_NULL
     101              1            101      
     101              2                       'First'   
     101              3                                    'Y'
     102              1            102      
     102              2                       'Second'  
     102              3                       'Inactive'    
     103              1            103      
     103              2                       'Third'   
     103              3                       'Active'  

我的想法是,如果我可以通过索引访问表B的列,我应该能够遍历表并创建结果表。我也认为应该可以使用递归SQL,但仍然需要能够通过索引引用列。

有什么想法吗?

编辑: 表A应该定义列是否为数字,字母数字以及是否为NULL。实际上,就我而言,这是一个简单的部分,所以基本上获取以下表格的信息就是我想要的。

Product_number  Column_number   Value
     101              1         '101'       
     101              2         'First' 
     101              3         'NULL'     -- Could of course just exclude this line to show that Product_status is NULL for Product_id 101
     102              1         '102'       
     102              2         'Second'    
     102              3         'Inactive'  
     103              1         '103'       
     103              2         'Third' 
     103              3         'Active'    

1 个答案:

答案 0 :(得分:0)

第一个查询代表您最初请求的表:

select 
    b.product_id "Product_number",
    a.column_id "Column_number",
    case 
        when a.data_type = 'N' then b.product_id else null 
    end "Num_value",
    case 
        when ( a.data_type = 'A' and a.column_id = 2 ) then b.product_name 
        when ( a.data_type = 'A' and a.column_id = 3 ) then b.product_status else null 
    end "Alpha_value",
    case 
        when a.NULL_ = 'Y' and b.product_Status is null then 'Y' else null 
    end "Is_NULL"
 from  b, a
 order by 1, 2;

第二个查询代表您发布的修改版本,但是如果您要针对其他列进行扩展,则可能更容易出错。

 select 
    b.product_id "Product_number",
    a.column_id "Column_number",
    case 
        when a.data_type = 'N' then to_char(b.product_id)
        when ( a.data_type = 'A' and a.column_id = 2 ) then to_char(b.product_name) 
        when ( a.data_type = 'A' and a.column_id = 3 ) then to_char(b.product_status)
        when a.NULL_ = 'Y' and b.product_Status is null then 'Y' 
        else null 
    end "Value"
 from b, a
 order by 1, 2;