想一个sql语句弄得又头大了,大家帮忙看看,谢谢

ZZZ5512536 2011-09-24 03:36:39

process_table // 项目进度表,字段如下
id: // 进程id ( 起始 100400-100410)
description: // 进度名 如:100400:申报 100401:审查


org_table // 区县表,字段如下
id: // 区县id
org: // 区县名


user_table //用户表,字段如下
id: //用户id
org: //用户所在区县 (即 org_table.org = user_table.org )

projects_table // 项目表,字段如下
id : // 项目Id
process : // 进程
creator : // 项目的创建者(与user表对应 即projects.creator = user_table.id)
100400


想法是求出: id=70的区县处于各个进度的项目数量有多少,要将所有进度都列出,如果没有处于该进度的项目则为0,比如:
进度 项目数
申报 7
审查 0
……
下发证书 1

...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZZZ5512536 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maco_wang 的回复:]

SQL code
select 进度=b.description,项目数=count(1)
from projects_table a
left join process_table b on a.process =b.id
left join user_table c on a.creator =c.id
left join org_table d on c.org=d.org
wher……
[/Quote]
user_table是有用户名的,但感觉与题无关就省略了。
谢谢你的回答,看来设计数据库字段也得很讲究才行。
叶子 2011-09-24
  • 打赏
  • 举报
回复
select 进度=b.description,项目数=count(1) 
from projects_table a
left join process_table b on a.process =b.id
left join user_table c on a.creator =c.id
left join org_table d on c.org=d.org
where d.id=70 group by b.description

--对于关系你是知道的,直接连接查询,加上where条件即可。

你的user_table为什么没有用户名?
你的user_table表中的区县为什么存的是区县名称?建议用id。
ZZZ5512536 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maco_wang 的回复:]

有些不太明白的地方:
1、项目进度表中没有项目id?那是用项目表中的process 进程进行连接吗?
2、如果是用项目表中的process 进程连接项目进度表的话,建议字段名改成processid
3、如果一个项目开始的进行是100400 后面变成了100401,是不是只更新项目表的进度就可以了?

如果是的话:
SQL code
select 进度=b.description,项……
[/Quote]

看了下你的sql,区县这表也应该药用上吧,毕竟是根据区县id来求处于各进度的项目数的
ZZZ5512536 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maco_wang 的回复:]

有些不太明白的地方:
1、项目进度表中没有项目id?那是用项目表中的process 进程进行连接吗?
2、如果是用项目表中的process 进程连接项目进度表的话,建议字段名改成processid
3、如果一个项目开始的进行是100400 后面变成了100401,是不是只更新项目表的进度就可以了?

如果是的话:
SQL code
select 进度=b.description,项……
[/Quote]

前2条确是我疏忽了,应该改为processid,最后一条没有看明白。
noteasytoregister 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzz5512536 的回复:]

另外还请教一下分别使用left join等外连接与使用where连接多表的时机?

请大家指教,感谢!
[/Quote]
当你想要返回左表中的不匹配行时用left join.
叶子 2011-09-24
  • 打赏
  • 举报
回复
有些不太明白的地方:
1、项目进度表中没有项目id?那是用项目表中的process 进程进行连接吗?
2、如果是用项目表中的process 进程连接项目进度表的话,建议字段名改成processid
3、如果一个项目开始的进行是100400 后面变成了100401,是不是只更新项目表的进度就可以了?

如果是的话:
select 进度=b.description,项目数=count(1) 
from projects_table a left join process_table b
on a.process =b.id group by b.description
ZZZ5512536 2011-09-24
  • 打赏
  • 举报
回复
另外还请教一下分别使用left join等外连接与使用where连接多表的时机?

请大家指教,感谢!

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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