表1 字段:档案编号(dangan_number),享受面积(xsmj),职工姓名,配偶姓名
表2字段:档案编号(dangan_number),房屋地址,房屋面积(fwmj),房屋性质fwxz(集资房、商品房),职工姓名,配偶姓名,房屋产权人表1中每个职工档案编号唯一,也就是档案编号是唯一的,对于表2来说,由于一个职工可能有多套住房,表2中的档案编号可能是多条,房屋地址及对应的住房面积和房屋性质也就可能是一条或是多条,无房的职工表2是0条数据,这里面如果配偶有房,也就是产权人是配偶,也算是职工的房屋,也就在表2中加一条记录。我在我认为能用到的字段起了名字现在求的是:住房未达标的人数 和 与享受面积差,未达标指的是该人首先有房子(产权性质是集资房才算有房),但该房屋面积小于该人住房享受面积,与享受面积差指的是所有未达标的职工总的享受面积和与他们现有集资房面积总和的差。
享受面积(xsmj)
表2字段:档案编号(dangan_number),房屋地址,房屋面积(fwmj),房屋性质fwxz(集资房、商品房),职工姓名,配偶姓名,房屋产权人表1中每个职工档案编号唯一,也就是档案编号是唯一的,对于表2来说,由于一个职工可能有多套住房,表2中的档案编号可能是多条,房屋地址及对应的住房面积和房屋性质也就可能是一条或是多条,无房的职工表2是0条数据,这里面如果配偶有房,也就是产权人是配偶,也算是职工的房屋,也就在表2中加一条记录。我在我认为能用到的字段起了名字现在求的是:住房未达标的人数 和 与享受面积差,未达标指的是该人首先有房子(产权性质是集资房才算有房),但该房屋面积小于该人住房享受面积,与享受面积差指的是所有未达标的职工总的享受面积和与他们现有集资房面积总和的差。
享受面积(xsmj)
select sum(shiyong_mianji) from house_info_table
where chanquan_xingzhi='集资购房'group by dangan_number having sum(shiyong_mianji)
每个集资房职工的享受面积:
select xsmj from emp_info_table where dangan_number
in(select distinct dangan_number from house_info_table where chanquan_xingzhi='集资购房')
对比这组数据似乎能得出结果,不过做到这我就不会了
1、
select count(a.dangan_number) 住房未达标的人数 from emp_info_table a
where xsmj>(select sum(fwmj) from house_info_table where fwxz='集资购房' where a.dangan_number=dangan_number group by dangan_number )2、
select t1.sum_xsmj-t2.sum_fwmj from
(elect sum(a.xsmj) sum_xsmj from emp_info_table a
where xsmj>(select sum(fwmj) from house_info_table where fwxz='集资购房' where a.dangan_number=dangan_number group by dangan_number )
) t1 ,
(select sum(fwmj) sum_fwmj from house_info_table where fwxz='集资购房') t2
1.
SELECT COUNT(a.dangan_number)
FROM EMP_INFO_TABLE a
WHERE a.xsmj<(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房') AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )2.
SELECT t1.sum_xsmj-t2.sum_fwmj FROM
(SELECT SUM(a.xsmj) sum_xsmj
FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房') AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
) t1 ,
(SELECT SUM(shiyong_mianji) sum_fwmj FROM HOUSE_INFO_TABLE WHERE
dangan_number IN (SELECT a.dangan_number
FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房'OR b.chanquan_xingzhi='承租住房') AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number ) )
) t2
但是我希望出的结果与此还有差别,就是有个按单位进行汇总,每一个结果都是一个单位,在emp_info_table中还有工作单位(gzdw)字段,另外还有一个单位字典(表名是dic_dept)
我已经把第一个结果按单位汇总写出来了,如下:
未达标职工人数按单位分类
SELECT ROWNUM,t.* FROM (
SELECT b.deptname,COUNT(a.gzdw) FROM EMP_INFO_TABLE a,DIC_DEPT b
WHERE b.deptname=a.gzdw(+) AND a.dangan_number IN(SELECT a.dangan_number
FROM EMP_INFO_TABLE a
WHERE a.xsmj<(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房') AND
a.dangan_number=b.dangan_number GROUP BY b.dangan_number ))
GROUP BY b.deptname )t
但是对于将未达标职工与享受面积差按单位分类没写出来,希望 gelyon及其他高手再给点思路。
序号 单位 未达标人数 未达标与享受面积差
1 A单位 14 334
2 B单位 0 0
3 C单位 1 13————————————————————
并且以上结果并没有统计出未达标人数为0的单位,如B单位,如果将
WHERE b.deptname=a.gzdw(+) AND a.dangan_number IN(
改为WHERE b.deptname=a.gzdw(+) AND a.dangan_number(+) IN(
提示错误:ORA-01799: 列不可以外部连接到子查询 ,请问各位高手该怎么实现我想要的结果。
--排了下版,不知道满足你的了不
1、
SELECT ROWNUM,t.* FROM (
SELECT b.deptname,Nvl(COUNT(a.gzdw),0) FROM EMP_INFO_TABLE a,DIC_DEPT b
WHERE b.deptname=a.gzdw(+) AND a.dangan_number IN(
SELECT a.dangan_number FROM EMP_INFO_TABLE a
WHERE a.xsmj<(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
)
GROUP BY b.deptname )t2、
SELECT b.deptname,Nvl(t3.chaji,0) FROM DIC_DEPT b ,(
SELECT t1.gzdw,(t1.sum_xsmj-t2.sum_fwmj) chaji FROM
(SELECT a.gzdw,SUM(a.xsmj) sum_xsmj FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
GROUP BY a.gzdw
) t1 ,
(SELECT gzdw,SUM(shiyong_mianji) sum_fwmj FROM HOUSE_INFO_TABLE
WHERE dangan_number IN (SELECT a.dangan_number FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房'OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
)
GROUP BY gzdw ) t2
WHERE t1.gzdw=t2.gzdw
) t3
WHERE b.deptname=t3.gzdw(+)
这样还要嵌套一层,想想。下班了我,晚上回去再给你看看你先改下
这个是最后修改的,应该可以了,第2个问题,不清楚是否house_info_table中表结构,
最好给出你的表结构:
家里没法排版,你看看可以了不,不行明天再说。1、
SELECT ROWNUM,t.* FROM (
SELECT d.deptname,Nvl(c.cnt,0) FROM DIC_DEPT d,
(SELECT a.gzdw,coumt(1) cnt FROM EMP_INFO_TABLE a
WHERE a.xsmj<(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number
)
GROUP BY a.gzdw
) c
WHERE d.deptname=c.gzdw(+)
)t
2、假设你house_info_table中表中有工作单位字段gzdwSELECT b.deptname,Nvl(t3.chaji,0) FROM DIC_DEPT b ,(
SELECT t1.gzdw,(t1.sum_xsmj-t2.sum_fwmj) chaji FROM
(SELECT a.gzdw,SUM(a.xsmj) sum_xsmj FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
GROUP BY a.gzdw
) t1 ,
(SELECT h.gzdw,Sum(h.shiyong_mianji)sum_fwmj FROM HOUSE_INFO_TABLE h
WHERE EXISTS(SELECT 1 FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房'OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
AND h.dangan_number =a.dangan_number )
GROUP BY h.gzdw
) t2
WHERE t1.gzdw =t2.gzdw
) t3
WHERE b.deptname=t3.gzdw(+)
哦 那你把我12 楼中 t2 这个子结果这样改:
(SELECT substr(h.dangan_number,1,length(h.dangan_number)-5) gzdw,Sum(h.shiyong_mianji)sum_fwmj FROM HOUSE_INFO_TABLE h
WHERE EXISTS(SELECT 1 FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房'OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number )
AND h.dangan_number =a.dangan_number )
GROUP BY substr(h.dangan_number,1,length(h.dangan_number)-5)
) t2
不行吗?
为什么?
语句如下:
SELECT ROWNUM,t.* FROM (
SELECT DISTINCT(b.deptname),NVL(t3.chaji,0) FROM DIC_DEPT b ,
(
SELECT t1.sub_dangan_number ,(t1.sum_xsmj-t2.sum_fwmj) chaji FROM
(
SELECT SUBSTR(a.dangan_number,1,LENGTH(a.dangan_number)-5) sub_dangan_number,SUM(a.xsmj) sum_xsmj FROM EMP_INFO_TABLE a
WHERE a.xsmj>
(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房' OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number
)
GROUP BY SUBSTR(a.dangan_number,1,LENGTH(a.dangan_number)-5)
) t1 ,
(
SELECT SUBSTR(h.dangan_number,1,LENGTH(h.dangan_number)-5) gzdw,SUM(h.shiyong_mianji)sum_fwmj FROM HOUSE_INFO_TABLE h
WHERE EXISTS(SELECT 1 FROM EMP_INFO_TABLE a
WHERE a.xsmj>(SELECT SUM(b.shiyong_mianji) FROM HOUSE_INFO_TABLE b
WHERE (b.chanquan_xingzhi='集资购房' OR b.chanquan_xingzhi='房改购房'OR b.chanquan_xingzhi='承租住房')
AND a.dangan_number=b.dangan_number GROUP BY b.dangan_number
)
AND h.dangan_number =a.dangan_number )
GROUP BY SUBSTR(h.dangan_number,1,LENGTH(h.dangan_number)-5)
) t2
WHERE t1.sub_dangan_number =t2.gzdw
)
t3
WHERE b.deptcode=t3.sub_dangan_number(+)
)t ————————————
再次表示感谢!