2012-09-17 38 views
2

是否可以将case语句中的每个WHEN输出到其自己的列中?我尝试过但没有运气。最接近我已经达到我想要的是以下。将SQL case语句显示为不同的列

我现在有一个查询,如下所示:

select BH.BATCH     as batch_number, 
     BS.TBS_DESCRIPTION  as batch_description, 
     BH.NUM_VOUCHERS   as "NUM_VOUCHERS(BATCH)", 
     case when VS.TVS_CODE = 1 then count(*) else 0 end as in_stock, 
     case when VS.TVS_CODE = 3 then count(*) else 0 end as terminate, 
     case when VS.TVS_CODE = 5 then count(*) else 0 end as in_progress, 
     case when VS.TVS_CODE = 6 then count(*) else 0 end as used, 
     case when VS.TVS_CODE = 8 then count(*) else 0 end as deactivate 
from BATCH_HIST bh, 
    BATCH_STATUS bs, 
    VOUCH_HIST vh, 
    VOUCH_STATUS vs 
where substr(BH.ALLOCAT_DATE, 1, 6) = 201207 
and to_char(BH.STATUS) = BS.TBS_CODE 
and BH.BATCH = VH.BATCH 
and to_char(VH.STATUS) = VS.TVS_CODE 
group by BH.BATCH, 
     BS.TBS_DESCRIPTION, 
     BH.NUM_VOUCHERS, 
     VS.TVS_CODE 
order by 1,2,3; 

这给了我下面的输出,每个STATUS为不同的记录:

BATCH_NUMBER | BATCH_DESCRIPTION | NUM_VOUCHERS(BATCH) | IN_STOCK | TERMINATE | IN_PROGRESS | USED | DEACTIVATE 
------------------------------------------------------------------------------------------------------------------------------ 
4413565  | Allocate   | 100     | 67  | 0   | 0   | 0 | 0 
4413565  | Allocate   | 100     | 0  | 0   | 0   | 33 | 0 
4413566  | Allocate   | 100     | 63  | 0   | 0   | 0 | 0 
4413566  | Allocate   | 100     | 0  | 0   | 0   | 37 | 0 

我想这个组合在一起,以便有是每个BATCH_NUMBER的一个记录:

BATCH_NUMBER | BATCH_DESCRIPTION | NUM_VOUCHERS(BATCH) | IN_STOCK | TERMINATE | IN_PROGRESS | USED | DEACTIVATE 
------------------------------------------------------------------------------------------------------------------------------ 
4413565  | Allocate   | 100     | 67  | 0   | 0   | 33 | 0 
4413566  | Allocate   | 100     | 63  | 0   | 0   | 37 | 0 

回答

5

表达,正如你所写,它要求分组,但如果你总结匹配,你可以从组中删除tvs_code:

select BH.BATCH     as batch_number, 
     BS.TBS_DESCRIPTION  as batch_description, 
     BH.NUM_VOUCHERS   as "NUM_VOUCHERS(BATCH)", 
     sum (case when VS.TVS_CODE = 1 then 1 else 0 end) as in_stock, 
     sum (case when VS.TVS_CODE = 3 then 1 else 0 end) as terminate, 
     sum (case when VS.TVS_CODE = 5 then 1 else 0 end) as in_progress, 
     sum (case when VS.TVS_CODE = 6 then 1 else 0 end) as used, 
     sum (case when VS.TVS_CODE = 8 then 1 else 0 end) as deactivate 
from BATCH_HIST bh, 
    BATCH_STATUS bs, 
    VOUCH_HIST vh, 
    VOUCH_STATUS vs 
where substr(BH.ALLOCAT_DATE, 1, 6) = 201207 
and to_char(BH.STATUS) = BS.TBS_CODE 
and BH.BATCH = VH.BATCH 
and to_char(VH.STATUS) = VS.TVS_CODE 
group by BH.BATCH, 
     BS.TBS_DESCRIPTION, 
     BH.NUM_VOUCHERS 
order by 1,2,3; 
1

这包装你当前的查询。也许这可以帮助你。

SELECT subQuery.BATCH_NUMBER, 
     subQuery.BATCH_DESCRIPTION, 
     subquery."NUM_VOUCHERS(BATCH)", 
     MAX(subquery.in_stock) AS in_stock, 
     MAX(subquery.terminate) AS terminate, 
     MAX(subquery.in_progress) AS in_progress, 
     MAX(subquery.used) AS used, 
     MAX(subquery.deactivate) AS deactivate 
FROM 
(
    select BH.BATCH     as batch_number, 
      BS.TBS_DESCRIPTION  as batch_description, 
      BH.NUM_VOUCHERS   as "NUM_VOUCHERS(BATCH)", 
      case when VS.TVS_CODE = 1 then count(*) else 0 end as in_stock, 
      case when VS.TVS_CODE = 3 then count(*) else 0 end as terminate, 
      case when VS.TVS_CODE = 5 then count(*) else 0 end as in_progress, 
      case when VS.TVS_CODE = 6 then count(*) else 0 end as used, 
      case when VS.TVS_CODE = 8 then count(*) else 0 end as deactivate 
    from BATCH_HIST bh, 
     BATCH_STATUS bs, 
     VOUCH_HIST vh, 
     VOUCH_STATUS vs 
    where substr(BH.ALLOCAT_DATE, 1, 6) = 201207 
    and to_char(BH.STATUS) = BS.TBS_CODE 
    and BH.BATCH = VH.BATCH 
    and to_char(VH.STATUS) = VS.TVS_CODE 
    group by BH.BATCH, 
      BS.TBS_DESCRIPTION, 
      BH.NUM_VOUCHERS, 
      VS.TVS_CODE 
) AS subQuery 
GROUP BY subQuery.BATCH_NUMBER, 
     subQuery.BATCH_DESCRIPTION, 
     subquery."NUM_VOUCHERS(BATCH)"