日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

UNPIVOT列轉行

本文主要介紹在Oracle數據庫中如何將數據表的列轉換為行。

背景說明

在Oracle中使用UNPIVOT實現列轉行。語法如下:

SELECT ...    
FROM  ...    
UNPIVOT [INCLUDE|EXCLUDE NULLS]    
   (unpivot_clause    
    unpivot_for_clause    
    unpivot_in_clause )    
WHERE ...

解決方案

在Oracle中使用UNPIVOT語法進行列轉行的代碼示例如下:

SELECT *    
FROM  pivoted_data    
UNPIVOT (    
deptsal                      
FOR saldesc                  
IN (d10_sal, d20_sal, d30_sal, d40_sal)    
);    
    
     
    
JOB       SALDESC       DEPTSAL    
---------- ---------- ----------    
CLERK     D10_SAL          1430    
CLERK     D20_SAL          2090    
CLERK     D30_SAL          1045    
SALESMAN  D30_SAL          6160    
PRESIDENT D10_SAL          5500    
MANAGER   D10_SAL          2695    
MANAGER   D20_SAL        3272.5    
MANAGER   D30_SAL          3135    
ANALYST   D20_SAL          6600

其他操作

在PolarDB O引擎中使用Crosstab函數接口進行列轉行操作。

代碼示例

with a as (  -- A對應原始數據(即需要列轉行的數據)  
select     
  js->>'seller' as seller,       
  js->>'se_year' as se_year,      
  jan  ,    
  feb  ,    
  mar  ,    
  apr  ,    
  may  ,    
  jun  ,    
  jul  ,    
  aug  ,    
  sep  ,    
  oct  ,    
  nov  ,    
  dec     
from crosstab(    
  -- 這個是需要進行行列變換的數據源。    
  -- 排序字段為group by字段,最后一個字段為轉換后的內容字段,導數第二個字段為行列變換的字段(內容為枚舉,比如月份)    
  -- (必須在下一個參數中提取出對應的所有枚舉值)    
  $$select jsonb_build_object('seller', seller, 'se_year', se_year) as js, se_month, sum(se_amount) from tbl_sellers_info group by 1,2 order by 1$$,        
  -- 行列轉換的行,有哪些值被提取出來作為列。 這個在這里代表的是月份,也就是se_month的值     
  -- 或(select * from (values('jan'),...('dec')) t(se_month))    
  'select distinct se_month from tbl_sellers_info order by 1'          
)     
as   -- crosstab 輸出格式    
(  js jsonb,  -- 第一個參數SQL內對應的order by對應的字段(1個或多個)    
   Jan numeric,  -- 第一個參數SQL內對應導數第二個字段的枚舉值,(行轉列)    
   feb numeric,  -- ...同上    
   mar numeric,    
   apr numeric,    
   may numeric,    
   jun numeric,    
   jul numeric,    
   aug numeric,    
   sep numeric,    
   oct numeric,    
   nov numeric,    
   dec numeric    
)     
order by 1,2    
)    
,     
-- b , 用jsonb把多列合并為一列,并使用jsonb_each展開。  
b as (select seller, se_year, jsonb_each(row_to_json(a)::jsonb-'seller'::text-'se_year'::text) as rec  from a)     
select seller, se_year, (b.rec).key as month, (b.rec).value as sum from b;