我正在试图弄清楚如何转置结果数据。这是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'
答案 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;