数据库是Oracle,谢谢大神回答
解决方案 »
- oracle递归查询中,每个层次都按照既定的字段(如:px字段)排序,请问如何处理
- 帮忙给解决一个oracle启动不了的问题
- Oracle多表的模糊查询
- 特定场景下,分区用list好,还是range好?
- 关于Oracle数据库升级(DBUA)
- 警告: 创建的触发器带有编译错误。
- 这样的想法能实现吗?
- 新手的简单问题,怎么给B用户授以A用户的所有表、视图的SELECT权限?
- "请不要发表可能给我们带来伤害的言论,谢谢配合",请问发一条SQL语句为何会出现以上提示??
- 关于游标的问题,请解答
- 如何实现当两张表拥有共同的字段时,将两张表相应内容插入第三张表?
- 求助,oracle如何查看详细的运行记录
case when a.停车场='a' then a.车类 end as 车类,
case when a.停车场='a' then a.进场总数 end as 进场总数,
case when b.停车场='a' then b.放车数 end as 放车数,
case when c.停车场='a' then c.报废数 end as 报废数,
......
from
(select 车类,停车场,count(*) as 进场总数 from 进场表 group by 车类,停车场) a,
(select 车类,停车场,sum(是否放车) as 放车数 from 进场表 group by 车类,停车场) b,
(select 车类,停车场,sum(是否报废) as 报废数 from 进场表 group by 车类,停车场) c
where a.车类 = b.车类 and a.车类 = c.车类 and a.停车场 = b.停车场 and a.停车场 = c.停车场存量无法计算,需要给出统计口径
case when a.停车场='a' then a.车类 end as 车类,
case when a.停车场='a' then a.进场总数 end as 进场总数,
case when b.停车场='a' then b.放车数 end as 放车数,
case when c.停车场='a' then c.报废数 end as 报废数,
......
from
(select 车类,停车场,count(*) as 进场总数 from 进场表 group by 车类,停车场 order by 车类) a,
(select 车类,停车场,sum(是否放车) as 放车数 from 进场表 group by 车类,停车场 order by 车类) b,
(select 车类,停车场,sum(是否报废) as 报废数 from 进场表 group by 车类,停车场 order by 车类) c
where a.车类 = b.车类 and a.车类 = c.车类存量无法计算,需要给出统计口径
select 1 "车类", 'a' typ, 1 c1, 2 c2, 3 c3, 4 c4 from dual union all
select 3 "车类", 'a' typ, 12 c1, 23 c2, 34 c3, 45 c4 from dual union all
select 3 id, 'b' typ, 11 c1, 2 c2, 3 c3, 4 c4 from dual
)
select*from tab1 t1
pivot(max(c1) c1, max(c2) c2, max(c3) c3, max(c4) c4 for typ in ('a' typ_a, 'b' typ_b))
;
也可以用传统的纵转横写法,但是楼上的有点传统过头了
停车场A进场总数,
停车场A放车数,
停车场A报废数,
停车场A存量,
停车场B进场总数,
停车场B放车数,
停车场B报废数,
停车场B存量
FROM (
SELECT T.车辆类型,
SUM(CASE WHEN T.停车场 = 'a' THEN 1 ELSE 0 END) 停车场A进场总数,
SUM(CASE WHEN T.停车场 = 'a' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场A放车数,
SUM(CASE WHEN T.停车场 = 'a' AND T.是否报废 = 1 THEN 1 ELSE 0 END) 停车场A报废数,
SUM(CASE WHEN T.停车场 = 'a' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停车场 = 'a' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场A存量,
SUM(CASE WHEN T.停车场 = 'b' THEN 1 ELSE 0 END) 停车场B进场总数,
SUM(CASE WHEN T.停车场 = 'b' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场B放车数,
SUM(CASE WHEN T.停车场 = 'b' AND T.是否报废 = 1 THEN 1 ELSE 0 END) 停车场B报废数,
SUM(CASE WHEN T.停车场 = 'b' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停车场 = 'b' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场B存量,
1 TY
FROM 进场表 T GROUP BY T.车辆类型
UNION ALL
SELECT '合计' 车辆类型,
SUM(CASE WHEN T.停车场 = 'a' THEN 1 ELSE 0 END) 停车场A进场总数,
SUM(CASE WHEN T.停车场 = 'a' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场A放车数,
SUM(CASE WHEN T.停车场 = 'a' AND T.是否报废 = 1 THEN 1 ELSE 0 END) 停车场A报废数,
SUM(CASE WHEN T.停车场 = 'a' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停车场 = 'a' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场A存量,
SUM(CASE WHEN T.停车场 = 'b' THEN 1 ELSE 0 END) 停车场B进场总数,
SUM(CASE WHEN T.停车场 = 'b' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场B放车数,
SUM(CASE WHEN T.停车场 = 'b' AND T.是否报废 = 1 THEN 1 ELSE 0 END) 停车场B报废数,
SUM(CASE WHEN T.停车场 = 'b' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停车场 = 'b' AND T.是否放车 = 1 THEN 1 ELSE 0 END) 停车场B存量,
2 TY
FROM 进场表 T GROUP BY T.车辆类型 ) T ORDER BY T.TY,T.车辆类型 ;
with tab1 as (
select 1 id, 'a' typ, 1 c1, 2 c2, 3 c3, 4 c4 from dual union all
select 3 "车类", 'a' typ, 12 c1, 23 c2, 34 c3, 45 c4 from dual union all
select 3 id, 'b' typ, 11 c1, 2 c2, 3 c3, 4 c4 from dual
)
select t1.id,
sum(case when t1.typ = 'a' then t1.c1 else 0 end) a,
sum(case when t1.typ = 'a' then t1.c2 else 0 end)a,
sum(case when t1.typ = 'a' then t1.c3 else 0 end)a,
sum(case when t1.typ = 'a' then t1.c4 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c1 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c2 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c3 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c4 else 0 end)a
from tab1 t1
group by t1.id
;
高效的SQL几秒钟就能有结果,低效的甚至可能要等上几十分钟