--用到,case when語句,以及listagg
--整個流程控制語句 declare txtsqlcostitem varchar(8000); --case when 行轉列語句 selectsqltxtcostitem varchar(8000); --case when 行轉列語句后查詢字段 txtsqlcostitemex varchar(8000); --case when 行轉列語句ex selectsqltxtcostitemex varchar(8000); --case when 行轉列語句后查詢字段ex selectsqltxt varchar(8000); --定義查詢字段變量 sqltxtcostitem varchar(8000); --整個子查詢語句 begin select listagg('sum(nvl(case when materialofcostid= ''' || to_char(materialofcostid) || ''' then TspTaskVendorApportItems.vtaxinvalue end,0)) as vtaxinvalue' || to_char(MaterialCode), ',') within group(order by materialofcostid, MaterialCode) costitemvalue, listagg('vtaxinvalue' || to_char(MaterialCode), ',') within group(order by materialofcostid, MaterialCode) costitems, listagg('sum(nvl(case when materialofcostid= ''' || to_char(materialofcostid) || ''' then TspTaskVendorApportItems.vtaxexvalue end,0)) as vtaxexvalue' || to_char(MaterialCode), ',') within group(order by materialofcostid, MaterialCode) costitemvalue, listagg('vtaxexvalue' || to_char(MaterialCode), ',') within group(order by materialofcostid, MaterialCode) costitems into txtsqlcostitem, selectsqltxtcostitem, txtsqlcostitemex, selectsqltxtcostitemex --賦值變量 from (select TspTaskVendorApportItems.materialofcostid, materials.MaterialCode from TspTaskVendorApportItems inner join materials on TspTaskVendorApportItems.materialofcostid = materials.MaterialID group by TspTaskVendorApportItems.materialofcostid, materials.MaterialCode); sqltxtcostitem := ' '; selectsqltxt := ' '; -- IF (trim(txtsqlcostitem) is not null) IF (length(trim(txtsqlcostitem)) > 0) --判斷流程語句 then sqltxtcostitem := ' select TspTaskMatItems.TaskBillID,TspTaskMatItems.MaterialID,TspTaskMatItems.MatItemID , ' || txtsqlcostitem || ',' || txtsqlcostitemex || ' from TspTaskBills inner join TspTaskMatItems on TspTaskBills.TaskBillID=TspTaskMatItems.TaskBillID inner join TspTaskVendorApportItems on TspTaskMatItems.TaskBillID =TspTaskVendorApportItems.TaskBillID and TspTaskMatItems.MaterialID=TspTaskVendorApportItems.MaterialID and TspTaskVendorApportItems.MatItemID =TspTaskMatItems.MatItemID group by TspTaskMatItems.TaskBillID,TspTaskMatItems.MaterialID,TspTaskMatItems.MatItemID '; selectsqltxt := ',' || selectsqltxtcostitem || ',' || selectsqltxtcostitemex; end if; dbms_output.put_line(sqltxtcostitem); --打印子查詢語句 dbms_output.put_line(selectsqltxt); --查詢字段 end;
用到的表結構可以自行根據語句的里內容自行創建。
-- create table TspTaskVendorApportItems ( TaskBillID char(20), VenItemID varchar(4), MaterialofCostID char(20), MatItemID varchar(4), MaterialID char(20), VTaxInvalue decimal(20,8), VTaxExvalue decimal(20,8)); CREATE TABLE Materials ( MaterialID char(20) NOT NULL, MaterialCode nvarchar2(30) NOT NULL, MaterialName nvarchar2(225) NULL); CREATE TABLE TspTaskBills( TaskBillID char(20) NOT NULL); CREATE TABLE TspTaskMatItems( TaskBillID char(20) NOT NULL, MatItemID varchar(4) NOT NULL, MaterialID char(20) NULL);
要實現的是把每一TaskBillID ,MatItemID ,MaterialID 對應的多行MaterialofCostID 的VTaxInvalue ,VTaxExvalue 的值轉化為個個列
最終查詢語句生成如下
select TspTaskMatItems.TaskBillID, TspTaskMatItems.MaterialID, TspTaskMatItems.MatItemID, sum(nvl(case when materialofcostid = '00000000000000000026' then TspTaskVendorApportItems.vtaxinvalue end, 0)) as vtaxinvalueFY0001, sum(nvl(case when materialofcostid = '00000000000000008251' then TspTaskVendorApportItems.vtaxinvalue end, 0)) as vtaxinvalue2019091000010001, sum(nvl(case when materialofcostid = '00000000000000008266' then TspTaskVendorApportItems.vtaxinvalue end, 0)) as vtaxinvalueFY00011, sum(nvl(case when materialofcostid = '00000000000000000026' then TspTaskVendorApportItems.vtaxexvalue end, 0)) as vtaxexvalueFY0001, sum(nvl(case when materialofcostid = '00000000000000008251' then TspTaskVendorApportItems.vtaxexvalue end, 0)) as vtaxexvalue2019091000010001, sum(nvl(case when materialofcostid = '00000000000000008266' then TspTaskVendorApportItems.vtaxexvalue end, 0)) as vtaxexvalueFY00011 from TspTaskBills inner join TspTaskMatItems on TspTaskBills.TaskBillID = TspTaskMatItems.TaskBillID inner join TspTaskVendorApportItems on TspTaskMatItems.TaskBillID = TspTaskVendorApportItems.TaskBillID and TspTaskMatItems.MaterialID = TspTaskVendorApportItems.MaterialID and TspTaskVendorApportItems.MatItemID = TspTaskMatItems.MatItemID group by TspTaskMatItems.TaskBillID, TspTaskMatItems.MaterialID, TspTaskMatItems.MatItemID
結構如下
效果如下