我是Oracle新手。我有一个包含三列的Oracle表:serialno
,item_category
和item_status
。在第三列中,行的值为serviceable
,under_repair
或condemned
。
我想使用count来运行查询,以显示有多少是可维护的,有多少是在修复,有多少是针对每个项目类别的谴责。
我想运行类似的东西:
select item_category
, count(......) "total"
, count (.....) "serviceable"
, count(.....)"under_repair"
, count(....) "condemned"
from my_table
group by item_category ......
我无法在计数内运行内部查询。
这就是我想要的结果集:
item_category total serviceable under repair condemned
============= ===== ============ ============ ===========
chair 18 10 5 3
table 12 6 3 3
答案 0 :(得分:14)
您可以在COUNT函数中使用CASE或DECODE语句。
SELECT item_category,
COUNT (*) total,
COUNT (DECODE (item_status, 'serviceable', 1)) AS serviceable,
COUNT (DECODE (item_status, 'under_repair', 1)) AS under_repair,
COUNT (DECODE (item_status, 'condemned', 1)) AS condemned
FROM mytable
GROUP BY item_category;
输出:
ITEM_CATEGORY TOTAL SERVICEABLE UNDER_REPAIR CONDEMNED
----------------------------------------------------------------
chair 5 1 2 2
table 5 3 1 1
答案 1 :(得分:7)
这是一个非常基本的“分组依据”查询。如果你搜索到它,你会发现plenty of documentation如何使用它。
对于您的具体情况,您需要:
select item_category, item_status, count(*)
from <your table>
group by item_category, item_status;
你会得到这样的东西:
item_category item_status count(*)
======================================
Chair under_repair 7
Chair condemned 16
Table under_repair 3
根据需要更改列顺序
答案 2 :(得分:2)
我有writing this stuff的倾向,所以当我忘记怎么做时,我有一个容易找到的例子。
PIVOT条款是11g的新内容。从5年前开始,我希望你使用它。
示例数据
create table t
(
serialno number(2,0),
item_category varchar2(30),
item_status varchar2(20)
);
insert into t ( serialno, item_category, item_status )
select
rownum serialno,
( case
when rownum <= 12 then 'table'
else 'chair'
end ) item_category,
( case
--table status
when rownum <= 12
and rownum <= 6
then 'servicable'
when rownum <= 12
and rownum between 7 and 9
then 'under_repair'
when rownum <= 12
and rownum > 9
then 'condemned'
--chair status
when rownum > 12
and rownum < 13 + 10
then 'servicable'
when rownum > 12
and rownum between 23 and 27
then 'under_repair'
when rownum > 12
and rownum > 27
then 'condemned'
end ) item_status
from
dual connect by level <= 30;
commit;
和PIVOT查询:
select *
from
(
select
item_status stat,
item_category,
item_status
from t
)
pivot
(
count( item_status )
for stat in ( 'servicable' as "servicable", 'under_repair' as "under_repair", 'condemned' as "condemned" )
);
ITEM_CATEGORY servicable under_repair condemned
------------- ---------- ------------ ----------
chair 10 5 3
table 6 3 3
我仍然更喜欢@Ramblin'Man的做法(除了使用CASE代替DECODE)。
修改强>
刚刚意识到我遗漏了TOTAL专栏。我不确定是否有办法使用PIVOT子句获取该列,也许其他人知道如何。也许是我不经常使用它的原因。