SQL选择显示行数据作为varchar项的列

时间:2012-11-23 04:46:08

标签: sql select row

这是我用来生成表格的查询:

SELECT cu.idchanneluser AS Approver,
     mcr.idrule AS Rule,
     mrd.idseq AS Seq,
     mcr.idcust AS CustID,
     cu.iduser AS USERID
FROM mstchanneluser cu,
     mstcatruledetail mrd,
     mstcatrule mcr
WHERE idchannel='01'
     AND mrd.idlist=cu.iduser
     AND mrd.idrule=mcr.idrule
     AND mcr.nbrauth='2'
     AND mcr.isautoauth='N'

这是结果的快照:

enter image description here

但我想要这样的结果:

   FirstAuthorizer SecondAuthorzier Rule    
   rohitcorp        ajitcorp         3090  
   CORPTEST         TESTCORP         8634
   ABHIMAKER        CORPTEST         11705

我尝试了这个查询:

SELECT CASE WHEN idseq = '0' THEN idchanneluser ELSE NULL END AS Approver,
    case when idseq = '1' THEN idchanneluser  ELSE NULL END AS secondApprover,
    cu.idchanneluser AS Approver,
    mcr.idrule AS Rule,
    mrd.idseq AS Seq,
    mcr.idcust AS CustID,
    cu.iduser AS USERID
FROM mstchanneluser cu, 
    mstcatruledetail mrd, 
    mstcatrule mcr 
WHERE idchannel='01'
    AND mrd.idlist=cu.iduser
    AND mrd.idrule=mcr.idrule 
    AND mcr.nbrauth='2'
    AND mcr.isautoauth='N'

它将返回给我这个结果检查快照。

enter image description here

2 个答案:

答案 0 :(得分:3)

这是从您的第二个查询中获得的,您只需要使用MAX并按mcr.idrule分组

SELECT MAX(CASE WHEN idseq = '0' THEN idchanneluser ELSE NULL END) AS Approver
    ,  MAX(CASE WHEN idseq = '1' THEN idchanneluser ELSE NULL END) AS secondApprover
    ,  mcr.idrule AS RULE
FROM   mstchanneluser cu
    ,  mstcatruledetail mrd
    ,  mstcatrule mcr
WHERE idchannel = '01'
    AND mrd.idlist = cu.iduser
    AND mrd.idrule = mcr.idrule
    AND mcr.nbrauth = '2'
    AND mcr.isautoauth = 'N'
GROUP BY mcr.idrule

答案 1 :(得分:0)

具有分析功能的oracle的另一种方式导致滞后

select tab.y FirstAuthorizer,tab.x SecondAuthorzier,tab.rule from
(
select lead(appprover,0) over (partition by rule order by seq) x ,
lag(appprover,1) over (partition by rule order by seq) y,
rule
from tbl ) tab
where tab.y is not null;