Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对null列使用和理解pivot()_Sql_Oracle_Oracle11g_Null_Pivot - Fatal编程技术网

Sql 对null列使用和理解pivot()

Sql 对null列使用和理解pivot(),sql,oracle,oracle11g,null,pivot,Sql,Oracle,Oracle11g,Null,Pivot,这让我开始了 with inventory_row as (select 1 as item_id, '2014AA' as batch_year, 'AA' as batch_code from dual union all select 1 as item_id, '2012BB' as batch_year, 'BB' as batch_code from dual union all select 1 as item_id, '2012CC' as batch_year, 'CC' a

这让我开始了

with inventory_row as
(select 1 as item_id, '2014AA' as batch_year, 'AA' as batch_code from dual union all
select 1 as item_id, '2012BB' as batch_year, 'BB' as batch_code from dual  union all
select 1 as item_id, '2012CC' as batch_year, 'CC' as batch_code from dual  union all
select 2 as item_id, '2012BB' as batch_year, 'BB' as batch_code from dual  union all
select 3 as item_id, '2014AA' as batch_year, 'AA' as batch_code from dual  
)
select * from (
  select item_id,
         batch_year,
         batch_code
from inventory_row        
where ( batch_year = '2014AA' and  batch_code='AA')
      or 
      ( batch_year = '2012BB' and  batch_code='BB')           
)                
--pivot (max(item_id) for batch_year  in ( '2014AA' as batch_1, '2012BB' as batch_2))
期望的结果

转这个

ID      BATCH_YR CODE
1       2014AA  AA
1       2012BB  BB
2       2012BB  BB
3       2014AA  AA
进入这个

 ITEM_ID BATCH_14   CODE   BATCH_12   CODE
 1       2014AA     AA     2012BB       BB
 2       null       null   2012BB       BB
 3       2014AA     AA     null       null   
请尝试以下查询:

SELECT ID as ITEM_ID,
       MAX(CASE WHEN SUBSTR(BATCH_YR,1,4) = '2014' 
                 THEN BATCH_YR
                 ELSE NULL
            END) as BATCH_14,
       MAX(CASE WHEN SUBSTR(BATCH_YR,1,4) = '2014' 
                 THEN CODE
                 ELSE NULL
            END) as CODE_14,
       MAX(CASE WHEN SUBSTR(BATCH_YR,1,4) = '2012' 
                 THEN BATCH_YR
                 ELSE NULL
            END) as BATCH_12,
       MAX(CASE WHEN SUBSTR(BATCH_YR,1,4) = '2012' 
                 THEN CODE
                 ELSE NULL
            END) as CODE_12
FROM T
GROUP BY ID

正如原始问题中的注释所示,我已经将查询硬塞进了pivot查询中。需要验证min()是否是从业务角度在查询中使用的适当聚合

对于给定的数据集,它生成预期的结果

with inventory_row as
(select 1 as item_id, '2014AA' as batch_year, 'AA' as batch_code from dual union all
select 1 as item_id, '2012BB' as batch_year, 'BB' as batch_code from dual  union all
select 1 as item_id, '2012CC' as batch_year, 'CC' as batch_code from dual  union all
select 2 as item_id, '2012BB' as batch_year, 'BB' as batch_code from dual  union all
select 3 as item_id, '2014AA' as batch_year, 'AA' as batch_code from dual  
)
select item_id, 
min (Y2012_BATCH) BATCH_12,
min(Y2012_CODE) CODE_12,
min(Y2014_BATCH) BATCH_14,
min(Y2014_CODE) CODE_14
from
(
 select item_id,
         batch_year,
         batch_code,
         'CODE'||substr(batch_year,1,4) col_c
from inventory_row
)  
pivot
(min(batch_year) as batch,
 min(batch_code) as code
 for col_c in ('CODE2012' as Y2012 ,'CODE2014' as Y2014)
 )
 group by item_id
 order by item_id
结果:

   ITEM_ID BATCH_12 CODE_12 BATCH_14 CODE_14
---------- -------- ------- -------- -------
         1 2012BB   BB      2014AA   AA     
         2 2012BB   BB                      
         3                  2014AA   AA   

奥拉夫:欢迎来到SO。谢谢你的回复。