VC ODBC 两个表联合查询

okou0696 2010-04-18 02:44:47
表person(户主信息)
省名 市名 编号 户主名 性别

四川省 成都市 C001 张三 男
四川省 绵阳市 M001 李四 男


表family(家庭成员)
编号 关系 姓名 性别
C001 父子 张三儿子 男
C001 儿媳 张三儿媳 女
C001 孙子 张三孙子 男
M001 父子 李四儿子 男
M001 儿媳 李四儿媳 女
M001 孙女 李四孙女 女

//两个表的关系是以编号来连接的。

根据以上两个表,我想实现以下结果:
//根据性别统计
性别 人数
男 5
女 3
//根据行政区划统计
行政区划 人数
成都市 4
绵阳市 4


该如何实现?





注:我现在只实现了根据表A,以户的单位来统计
//代码如下:
case 5://按性别统计
//清空CtrlList 控件
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
//写第一行即标题
m_ctrResult.InsertColumn(0,"性别");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
//开始读取person 表
strSQL="select count(编号) as num ,性别 from person group by 性别";
while(!recordset.IsEOF())
{
recordset.GetFieldValue("性别",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;


case 4://按行政统计
//清空CtrlList 控件
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
//写第一行即标题
m_ctrResult.InsertColumn(0,"行政区划");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
//开始读取person 表
strSQL="select count(编号) as num ,行政区划 from person group by 行政区划";
while(!recordset.IsEOF())
{
recordset.GetFieldValue("编号",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;


//上面的代码只实现了根据表person 来统计人数
但实际上person 表只有户主。
family 表还有该户的家庭成员
我如何把表family也加入统计?
恳请老师们的帮助!!


性别问题似乎要好办一些,但根据行政区划来统计,很难。因为Family表里没有行政区划字段,只有编号。
恳请老师们提供思路和帮助。
万分感谢!!
...全文
253 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangliangdoplin 2011-12-08
  • 打赏
  • 举报
回复
用ado技术,我也往上找了,但是最好的就是循环太麻烦了。用ADO技术可以实现SQL的多表联合查询,返回结果。
ODBC中绑定的只是一个表,然后你要执行SQL语句的话,需要运行recordset.open,但是这个recordset是你已经定义的一个表,要提前定义好两个表联合查询后的表才行,这样很麻烦。
okou0696 2010-04-18
  • 打赏
  • 举报
回复
我仔细想过之后,发现我的目的是无法用一条SQL语句来实现的。

最后实在没办法,我用3个循环嵌套再自加。实现了功能。

还是感谢zyq5945.
zyq5945 2010-04-18
  • 打赏
  • 举报
回复
select person.市名, count(family.编号) from person, family where person.编号=
family.编号
okou0696 2010-04-18
  • 打赏
  • 举报
回复
TO 4楼的zyq5945

程序提示:试图执行的查询中不包含作为合计函数一部分的特定表达式'行政区划'。
zyq5945 2010-04-18
  • 打赏
  • 举报
回复
不熟悉SQL语句可以到这里看下
http://sql.1keydata.com/cn/sql-having.php
zyq5945 2010-04-18
  • 打赏
  • 举报
回复
select person.市名 as 行政区划, count(family.编号) as 人数 from person, family where person.编号=
family.编号
okou0696 2010-04-18
  • 打赏
  • 举报
回复
recordset 的定义,是 CPersonSet recordset;

CPersonSet 是重载的 CRecordSet类。只包含了person 一个表.
okou0696 2010-04-18
  • 打赏
  • 举报
回复
TO 二楼zyq5945老师。

//程序代码
strSQL="select person.市名 count(family.编号) as 人数 from person,family where person.编号=family.编号";
recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
//代码结束

运行提示:语法错误(操作符丢失)在查询表达式"person.市名 , count(family.编号)"

恳请继续帮助。
zyq5945 2010-04-18
  • 打赏
  • 举报
回复
编号是唯一的话,可以这样试试
select person.市名 行政区划, count(family.编号) as 人数 from person, family where person.编号=
family.编号

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧