2012-09-17 88 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)"