SELECT count(a.dangan_number), b.deptname FROM EMP_INFO_TABLE a,DIC_DEPT b WHERE a.dangan_number not in (SELECT DISTINCT dangan_number FROM
HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')
and b.deptname=a.gzdw(+) GROUP BY b.deptname
以上我写的语句没有实现把所有单位都显示出来,而是只显示出来了有记录的单位,在WHERE a.dangan_number not in (SELECT DISTINCT dangan_number FROM HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')处没有了思路,该如何写请与更正!谢谢!
HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')
and b.deptname=a.gzdw(+) GROUP BY b.deptname
以上我写的语句没有实现把所有单位都显示出来,而是只显示出来了有记录的单位,在WHERE a.dangan_number not in (SELECT DISTINCT dangan_number FROM HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')处没有了思路,该如何写请与更正!谢谢!
FROM EMP_INFO_TABLE a right join DIC_DEPT b
on b.deptname=a.gzdw
WHERE a.dangan_number not in (SELECT DISTINCT dangan_number FROM HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')
GROUP BY b.deptname;
HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房')
and b.deptname=a.gzdw(+) GROUP BY b.deptname
-----------------------------------------------------
这个一个比较典型的管理left join理解不彻底的错误
你的b表左连a表,如果a中不存在,则a.dangan_number这时为null,你要想not in不过滤掉这些内容,需要在对应条件上加(+)
该问题主要涉及3个表:
表1,emp_info_table,字段:档案编号(dangan_number),享受面积(xsmj)
表2,house_info_table,字段:档案编号(dangan_number),产权性质(chanquan_xingzhi):(集资房、商品房)
表3,单位字段(dic_dept):单位名(dic_dept)
每个职工都建档,在emp_info_table每个职工都有档案编号,有房的的职工在表2中建立房屋信息,所以有房职工在表2中又存在一个或多个档案编号(1户房1个档案编号,2户房2个,..),现在要按所单位进行统计无房职工人数和该部门所有职工的一个享受面积和。
对于建议在条件上加(+),这个我当然知道,不过不适合本问题。还请csdn的高手最好把这个问题都帮我解决,同时由于数据量较大,希望给我运算快点的算法!
实现效果:
单位 无房人数 无房享受面积和
单位1 33 1500
单位2 22 1100
单位3 0 0
单位4 0 0
该问题主要涉及3个表:
表1,emp_info_table,字段:档案编号(dangan_number),享受面积(xsmj)
表2,house_info_table,字段:档案编号(dangan_number),产权性质(chanquan_xingzhi):(集资房、商品房)
表3,单位字段(dic_dept):单位名(dic_dept)
每个职工都建档,在emp_info_table每个职工都有档案编号,有房的的职工在表2中建立房屋信息,所以有房职工在表2中又存在一个或多个档案编号(1户房1个档案编号,2户房2个,..),现在要按所单位进行统计无房职工人数和该部门所有无房职工的一个享受面积和,无房职工就是在表1中减去表2中的distinct 档案编号。
对于建议在条件上加(+),这个我当然知道,不过不适合本问题。还请csdn的高手最好把这个问题都帮我解决,同时由于数据量较大,希望给我运算快点的算法!
实现效果:
单位 无房人数 无房享受面积和
单位1 33 1500
单位2 22 1100
单位3 0 0
单位4 0 0
按照正常思路是这样写
SELECT distinct b.deptname,nvl(SUM(a.shiyong_mianji),0) FROM HOUSE_INFO_TABLE a,dic_dept b
WHERE (a.chanquan_xingzhi(+)='集资购房' or a.chanquan_xingzhi(+)='房改购房'OR a.chanquan_xingzhi(+)='承租住房')
and substr(a.dangan_number(+),1,5)= b.deptcode group by b.deptname
不过OR 或 IN 操作数中不允许外部连接运算符 (+)
我又试着按照这样的思路:
SELECT
* from
(select b.deptname,nvl(SUM(a.shiyong_mianji),0),a.chanquan_xingzhi FROM HOUSE_INFO_TABLE a,dic_dept b
WHERE substr(a.dangan_number(+),1,5)= b.deptcode group by b.deptname)
where chanquan_xingzhi='集资购房' OR chanquan_xingzhi='房改购房' OR chanquan_xingzhi='承租住房'
但写的还是不对,请教大家再给点思路
--由于你的是左连接+not in 这样会存在问题,必须分开做,不然会考虑不全的,你试试这样行不?
--先过滤掉属于集资购房的员工信息,然后再和单位表关联:
SELECT b.deptname,count(Nvl(a.dangan_number,0)) FROM DIC_DEPT b
left join (
SELECT c.* FROM EMP_INFO_TABLE c WHERE NOT EXISTS (
SELECT 1 FROM HOUSE_INFO_TABLE WHERE chanquan_xingzhi='集资购房' AND dangan_number=c.dangan_number)
) a
ON b.deptname=a.gzdw
GROUP BY b.deptname--至于你新增加的那个问题,求出现有职工住房使用面积,同样处理先过滤再外连接,你试试,没测试
SELECT distinct b.deptname,SUM(nvl(a.shiyong_mianji,0)) FROM dic_dept b
left join (
SELECT * FROM HOUSE_INFO_TABLE c
WHERE c.chanquan_xingzhi IN('集资购房','房改购房','承租住房') ) a
on
substr(a.dangan_number,1,5)= b.deptcode group by b.deptname
SELECT SUM(m.countDangan) AS Numm, m.deptname
FROM
(SELECT 0 AS countDangan, x1.deptname
FROM dic_dept x1
UNION ALL
(SELECT COUNT(x2.dangan_number) AS countDangan, x2.gzdw AS deptname
FROM emp_info_table x2
WHERE x2.dangan_number IN (SELECT DISTINCT t1.dangan_number
FROM emp_info_table t1
MINUS
(SELECT DISTINCT t2.dangan_number
FROM emp_info_table t2, house_info_table s2
WHERE t2.dangan_number=s2.dangan_number
AND (s2.chanquan_xingzhi='集资购房' or s2.chanquan_xingzhi='房改购房' or s2.chanquan_xingzhi='承租住房')))
GROUP BY x2.gzdw)
) m
group by m.deptname