是否可以将case语句中的每个WHEN
输出到自己的列中?我尝试过但没有运气。我最接近我想要的是下面。
我目前有一个查询如下:
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
答案 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 :(得分: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)"