数据库是Oracle,谢谢大神回答

解决方案 »

  1.   

    select 
    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.停车场存量无法计算,需要给出统计口径
      

  2.   

    select 
    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.车类存量无法计算,需要给出统计口径
      

  3.   

    with tab1 as (
    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))
    ;
    也可以用传统的纵转横写法,但是楼上的有点传统过头了
      

  4.   

    SELECT T.车辆类型,
    停车场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.车辆类型 ;
      

  5.   

    我这么写通用性和你一样,但是只需要查一次表。得出结果只是第一步,关键是效率啊。
    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
    ;
      

  6.   

    同意楼上的意见表数据量如果只有几W可能感觉不出什么差异,可数据量一旦达到一定数量级,比如上百万就会感觉到很明显的差距了
    高效的SQL几秒钟就能有结果,低效的甚至可能要等上几十分钟