是这样的,比如我现在有一张表house,里面记录了房号houseid,租金rent(固定值),usearea面积, re标记为1表示rent为0。
第二张表是charge表,字段有hid(房号),sfqj(记录的是哪户人几几年几几月的缴费信息,格式就是201201)。
第三张表是project表,字段有projectid,project(表示缴费的项目,比如租金,设施费(根据house表的面积算))等。
现在的我根据需求设计了另一张表qfb,记录欠费信息,字段有hid,re,projectid,project,Jan~Dec(需要算每个月的欠费记录)、然后就是怎么根据上面的三个表查出欠费信息再插入qfb? (一个人应该每次插入2条记录(2个缴费项目))我的想法是,根据house表查出houseid ,rent, re在charge表里根据对应的houseid 对应 hid查出这个人是否缴费了,假如他的缴费信息只有201112的租金,没有缴设施费,那么前11个月租金就是欠费,把结果插入qfb表,1~11月欠费项目租金就是他面积应交的rent,12月不插入信息,表示未欠费.   1~12月的设施费就是全欠,全部插入(面积*设施费)表示12个月都欠。
感觉好难啊,写不出来,哪个高手可以帮帮忙?

解决方案 »

  1.   

    描述的字太多了。   建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  2.   

    area表:
    DROP TABLE IF EXISTS `area`;
    CREATE TABLE `area` (
      `rowid` int(11) NOT NULL auto_increment,
      `areaname` varchar(30) default NULL,
      PRIMARY KEY  (`rowid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
    INSERT INTO `area` VALUES ('1', 'CSDN社区');house表:
    DROP TABLE IF EXISTS `house`;
    CREATE TABLE `house` (
      `rowid` bigint(20) NOT NULL auto_increment,
      `houseid` varchar(20) default NULL,
      `fzname` varchar(20) default NULL,
      `usearea` varchar(10) default NULL,
       `houproperties` char(1) default NULL COMMENT '0-公1-私',   /* 私没有房租 */
      `rent` decimal(16,2) default NULL,
      `sfyid` bigint(20) default NULL,
       `areaid` int(11) default NULL,
       PRIMARY KEY  (`rowid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2670 DEFAULT CHARSET=utf8;INSERT INTO `house` VALUES ('1', '1-1-1', '李四', '42.25', '0', '77.70', null, '', '2');charge表DROP TABLE IF EXISTS `charge`;
    CREATE TABLE `charge` (
      `rowid` bigint(20) NOT NULL auto_increment,
      `areaid` bigint(20) default NULL,
      `hid` varchar(20) default NULL,
      `sfqj` varchar(6) default NULL,
      `project` char(4) default NULL,
      `jcsf` char(1) default NULL,
      `jfje` decimal(16,2) default NULL,
      PRIMARY KEY  (`rowid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;INSERT INTO `charge` VALUES ('1', '1', '1-1-1', '201106', '1001', '0','77.70');project表DROP TABLE IF EXISTS `project`;
    CREATE TABLE `project` (
      `projectid` char(4) NOT NULL,
      `project` varchar(20) default NULL,
      `price` decimal(16,2) default NULL,
      `jcsf` char(1) default NULL,
      PRIMARY KEY  (`projectid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    INSERT INTO `project` VALUES ('1001', '房租', '0.00', '0');
    INSERT INTO `project` VALUES ('1002', '设施费', '0.18', '2');
    INSERT INTO `project` VALUES ('1003', '卫生费', '6.00', '1');现在又建立了这样的表,根据上面三个表,查询数据插入到这个表里。
    DROP TABLE IF EXISTS `qftjb`;
    CREATE TABLE `qftjb` (
      `rowid` int(11) NOT NULL auto_increment,
      `areaname` varchar(30) default NULL,
      `hid` varchar(20) default NULL,
      `fzname` varchar(20) default NULL,
      `houproperties` char(1) default NULL COMMENT '0-公1-私',
      `projectid` char(4) default NULL,
      `project` varchar(20) default NULL,
      `Jan` decimal(16,2) default NULL,
      `Feb` decimal(16,2) default NULL,
      `Mar` decimal(16,2) default NULL,
      `Apr` decimal(16,2) default NULL,
      `May` decimal(16,2) default NULL,
      `Jun` decimal(16,2) default NULL,
      `Jul` decimal(16,2) default NULL,
      `Aug` decimal(16,2) default NULL,
      `Sep` decimal(16,2) default NULL,
      `Oct` decimal(16,2) default NULL,
      `Nov` decimal(16,2) default NULL,
      `Dec` decimal(16,2) default NULL,
      PRIMARY KEY  (`rowid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

    我的想法是,在house表查出所有人的houseid ,rent, houproperties,然后在charge表里根据对应的houseid 对应 hid查出这个人是否有缴费信息,缴了哪些项目,假如他的缴费信息只有201112的租金,没有缴设施费,那么前11个月租金就是欠费,把结果插入qftjb表,1~11月欠费项目租金就是他面积应交的rent,12月不插入信息,表示未欠费. 1~12月的设施费就是全欠,全部插入(面积*设施费)这个值
      

  3.   


    比如是这样的数据:-- ----------------------------
    -- Records of qftjb
    -- ----------------------------
    INSERT INTO `qftjb` VALUES ('1', 'CSDN社区', '1-1-1', '李四', '公', '1001', '房租', '77.70', '77.70', '77.70', '77.70', '77.70',null,'77.70','77.70','77.70','77.70','77.70','77.70');
    INSERT INTO `qftjb` VALUES ('2', 'CSDN社区', '1-1-1', '李四', '公', '1003', '卫生费', '6.00', '6.00', '6.00', '6.00', '6.00', '6.00','6.00','6.00','6.00','6.00','6.00','6.00','6.00');
      

  4.   


    多复制了一个6.00
    INSERT INTO `qftjb` VALUES ('2', 'CSDN社区', '1-1-1', '李四', '公', '1003', '卫生费', '6.00', '6.00', '6.00', '6.00', '6.00', '6.00','6.00','6.00','6.00','6.00','6.00','6.00');
      

  5.   

    流程应该这样吧:遍历house表,遍历到第一条,就拿第一条的houseid放到project表里查他应该交的费用的projectid号,同时把金额算出来,然后根据这个结果再放到charge表查有无他的信息,如果一条都没,那么插入欠费表,全部欠费。有记录就根据条件过滤,比如他交几月的,交的什么费。然后再把结果插入欠费表,大循环结束.然后再去house表里遍历第二条...
      

  6.   

    还是写不出来啊,按9楼的流程来写怎么写呢?貌似要用存储过程写?如果只用SQL语句写,要怎么写。我最多只能查出来,但是不会转换缴费金额对应的月份,再插入欠费表的Jan~Dec的月份,
    select a.areaname,h.fzname,c.areaid,c.hid,c.project,c.jfje,if (h.houproperties='1',"公","私") as houproperties ,CONCAT(SUBSTR(c.sfqj,5),'月')as sfrq , c.sfyid from (charge c LEFT JOIN house h ON c.hid=h.houseid)LEFT JOIN project p ON c.project=p.projectid LEFT JOIN area a ON a.rowid=c.areaid ;
      

  7.   

    select a.areaname,h.fzname,c.areaid,c.hid,c.project,c.jfje,if (h.houproperties='1',"公","私") as houproperties ,CONCAT(SUBSTR(c.sfqj,5),'月')as sfrq , c.sfyid from (charge c LEFT JOIN house h ON c.hid=h.houseid)LEFT JOIN project p ON c.project=p.projectid LEFT JOIN area a ON a.rowid=c.areaid ;