一个sql高级测试
下面是一个数据表,表名为a 数据内容如下
地区代码  人数               人员类型
05010100        2038        社保补贴
05010200        94        社保补贴
05010300        483        社保补贴
05010400        385        社保补贴
05010500        214        社保补贴
05010600        433        社保补贴
05010700        961        社保补贴
05010800        44        社保补贴
05010900        22        社保补贴
05011000        60        社保补贴
05010100        147        公益性岗位
05010200        12        公益性岗位
05010300        25        公益性岗位
05010400        16        公益性岗位
05010500        4        公益性岗位
05010600        59        公益性岗位
05010700        56        公益性岗位
05011000        1        公益性岗位
05010100        3450        下岗失业人员
05010200        182        下岗失业人员
05010300        877        下岗失业人员
05010400        771        下岗失业人员
05010500        573        下岗失业人员
05010600        928        下岗失业人员
05010700        1896        下岗失业人员
05010800        97        下岗失业人员
05010900        196        下岗失业人员
05011000        132        下岗失业人员
05010100        257        就业培训
05010200        32        就业培训
05010300        73        就业培训
05010400        28        就业培训
05010500        15        就业培训
05010600        85        就业培训
05010700        142        就业培训
05010800        2        就业培训
05010900        3        就业培训
05011000        9        就业培训
现要想通过sql语句生成下面的效果,请问该怎么做?地区代码   下岗失业人数  社保补贴人数  公益性岗位人数  就业培训人数
05010100        xx        xx        xx        xx
05010200        xx        xx        xx        xx
05010300        xx        xx        xx        xx
05010400        xx        xx        xxx        xx
05010500        xx        xx        xx        xx
05010600        xx        xx        xx        xx
05010700        xx        xxx        xx        xx
05010800        xx        xx        xx        xx
05010900        xx        xx        xx        xx
05011000        xx        xx        xx        xx

解决方案 »

  1.   

    -- 太简单了,用CASE WHEN语句 或者 decode函数搞定!
      

  2.   

    CREATE TABLE a(
    dqdm VARCHAR2(10), 
    rs NUMBER(18,0), 
    rylx VARCHAR2(40));SELECT  dqdm as "地区代码", 
    sum(decode(rylx,'下岗失业人员',rs,0)) AS "下岗失业人数",
    sum(decode(rylx,'社保补贴',rs,0)) AS "社保补贴人数",
    sum(decode(rylx,'公益性岗位',rs,0)) AS "公益性岗位人数",
    sum(decode(rylx,'就业培训',rs,0)) AS "就业培训人数"
    from a
    group by dqdm;INSERT INTO a(dqdm,rs,rylx) values('05010100',2038,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010200',94,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010300',483,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010400',385,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010500',214,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010600',433,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010700',961,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010800',44,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010900',22,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05011000',60,'社保补贴');
    INSERT INTO a(dqdm,rs,rylx) values('05010100',147,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010200',12,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010300',25,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010400',16,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010500',4,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010600',59,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010700',56,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05011000',1,'公益性岗位');
    INSERT INTO a(dqdm,rs,rylx) values('05010100',3450,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010200',182,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010300',877,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010400',771,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010500',573,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010600',928,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010700',1896,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010800',97,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010900',196,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05011000',132,'下岗失业人员');
    INSERT INTO a(dqdm,rs,rylx) values('05010100',257,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010200',32,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010300',73,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010400',28,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010500',15,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010600',85,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010700',142,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010800',2,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05010900',3,'就业培训');
    INSERT INTO a(dqdm,rs,rylx) values('05011000',9,'就业培训');
      

  3.   

    -- 呵呵, 我是来蹭分的:再order by 一下!
    SELECT  dqdm as "地区代码", 
    sum(decode(rylx,'下岗失业人员',rs,0)) AS "下岗失业人数",
    sum(decode(rylx,'社保补贴',rs,0)) AS "社保补贴人数",
    sum(decode(rylx,'公益性岗位',rs,0)) AS "公益性岗位人数",
    sum(decode(rylx,'就业培训',rs,0)) AS "就业培训人数"
    from a
    group by dqdm
    order by dqdm;
      

  4.   

    SQL> edi
    已写入 file afiedt.buf  1  select 地区代码,
      2  sum(case when 人员类型='社保补贴' then 人数 else 0 end) "社保补贴人数",
      3  sum(case when 人员类型='公益性岗位' then 人数 else 0 end) "公益性岗位人数",
      4  sum(case when 人员类型='下岗失业人员' then 人数 else 0 end) "下岗失业人员人数",
      5  sum(case when 人员类型='就业培训' then 人数 else 0 end) "就业培训人数"
      6  from tb
      7  group by 地区代码
      8* order by 地区代码
      9  /地区代码   社保补贴人数 公益性岗位人数 下岗失业人员人数 就业培训人数
    ---------- ------------ -------------- ---------------- ------------
    05010100           2038            147             3450          257
    05010200             94             12              182           32
    05010300            483             25              877           73
    05010400            385             16              771           28
    05010500            214              4              573           15
    05010600            433             59              928           85
    05010700            961             56             1896          142
    05010800             44              0               97            2
    05010900             22              0              196            3
    05011000             60              1              132            9已选择10行。
      

  5.   

    使用unpiovt来实现select 地区代码,   下岗失业人数,  社保补贴人数,  公益性岗位人数,  就业培训人数
    from tb
    pivot
         (sum(人数 )
                  for 人员类型 in ('下岗失业人员','社保补贴','公益性岗位','就业培训')
                )x