首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

疑难统计有关问题!求高手!

2013-01-07 
疑难统计问题!!求高手!!本帖最后由 waCtr 于 2012-12-07 16:17:56 编辑有表如下:table1人员表(udi为人员ID

疑难统计问题!!求高手!!
本帖最后由 waCtr 于 2012-12-07 16:17:56 编辑 有表如下:
table1  人员表(udi为人员ID)
UName    Usid
张三     001
李四     002
table2  需要完成动作次数表(item为次数,utime为需要完成次数的时间月份)
usid   item     utime           itemID
001     3      2012-12-01    101
002     2      2012-12-01    102
101     7      2012-12-01    104
table3 动作表(itemid为动作ID)
itemID      itemName
101           搬箱子
102           搬椅子
103           搬桌子
104           搬电脑
这上面的表为 这个人某个月份需要完成哪些动作的次数
下面的表为  这个人某个月份 完成哪些动作的次数(1条数据算一次)
tableA  完成动作表(A)--inptime为完成时间,--did为数据ID
did         inptime
1            2012-12-01
2            2012-11-03
3            2012-12-03
tableB  完成动作表(B)--RName 为人名
did          RName 
1             张三
1             李四
2             张三
3             张三
3             李四
tableC  完成动作表(C)--itemName动作名称
did        itemName
1           搬箱子
1           搬椅子
2           搬椅子
3           搬箱子
3           搬椅子 
现在需要统计张三 在2012年12月份 完成的动作次数  如下形式显示
 动作类型    需要完成次数    完成次数
搬箱子          3                      2
搬电脑          7                      0

不知道表达清楚了没有! 这样好不好统计? 求解....
[解决办法]
看了一下,觉得楼主给的数据有点问题。还有后面3张表的关系也貌似木怎么看懂??
问题一:
table2  需要完成动作次数表(item为次数,utime为需要完成次数的时间月份)
usid   item     utime           itemID
001     3      2012-12-01    101
002     2      2012-12-01    102
101     7      2012-12-01    104


这里的101因该是001吧
问题二:
tableA  完成动作表(A)--inptime为完成时间,--did为数据ID
did         inptime
1            2012-12-01
2            2012-11-03
3            2012-12-03
tableB  完成动作表(B)--RName 为人名
did          RName 
1             张三
1             李四
2             张三
3             张三
3             李四
tableC  完成动作表(C)--itemName动作名称
did        itemName
1           搬箱子
1           搬椅子
2           搬椅子
3           搬箱子
3           搬椅子 

我猜其实这3张表是想表达这么个意思对么?(如果是,你上面的3张表这样设计感觉有问题的。)
张三  搬箱子  2012-12-01
李四  搬椅子  2012-12-01
张三  搬椅子  2012-11-03
张三  搬箱子  2012-12-03
李四  搬椅子  2012-12-03 

[解决办法]


-------------------应该完成部分----------------
--创建表table1
if OBJECT_ID('table1','u') is not null
drop table table1
create table table1
(
UName nvarchar(20),
Usid nvarchar(20)
)
go
insert into table1
select '张三','001' union all
select '李四','002'

--创建表table2
if OBJECT_ID('table2','u') is not null
drop table table2
create table table2
(
usid nvarchar(20),
item int,
utime Date,
itemID nvarchar(20)
)
go
insert into table2
select '001',3,'2012-12-01','101' union all
select '002',2,'2012-12-01','102' union all
select '001',7,'2012-12-01','104'
 
--创建表table3
if OBJECT_ID('table3','u') is not null
drop table table3
create table table3
(
itemID nvarchar(20),
itemName nvarchar(20),
)
go
insert into table3
select '101','搬箱子' union all
select '102','搬椅子' union all
select '103','搬桌子' union all
select '104','搬电脑'


-------------------实际完成部分----------------
--创建表TableA
if OBJECT_ID('TableA','u') is not null
drop table TableA
create table TableA
(
did int,
inptime date
)
go
insert into TableA
select 1,'2012-12-01' union all
select 2,'2012-11-03' union all
select 3,'2012-12-03'


--创建表TableB
if OBJECT_ID('TableB','u') is not null
drop table TableB
create table TableB
(
did int,
RName  nvarchar(20)
)
go
insert into TableB
select 1,'张三' union all
select 1,'李四' union all


select 2,'张三' union all
select 3,'张三' union all
select 3,'李四'
 

--创建表TableC
if OBJECT_ID('TableC','u') is not null
drop table TableC
create table TableC
(
did int,
itemName  nvarchar(20)
)
go
insert into TableC
select 1,'搬箱子' union all
select 1,'搬椅子' union all
select 2,'搬椅子' union all
select 3,'搬箱子' union all
select 3,'搬椅子'

select *From TableA
select *From TableB
select *From TableC


-------------------SQL部分------------------
--查询每个人应该完成动作次数
select T1.UName,T3.itemName,T2.item from table1 T1
inner join table2 T2 on T1.Usid = T2.usid
inner join table3 T3 on T2.itemID =T3.itemID

--查询每个人最终完成的次数
select B.RName,C.itemName,count(itemName) 完成次数 from TableA A 
inner join TableB B on A.did =B.did
inner join TableC C on A.did=C.did
group by b.RName,C.itemName

--最终SQL
select A.UName,A.itemName,A.item 需要完成动作次数,isnull(b.完成次数,0) 完成次数  from 
(select T1.UName,T3.itemName,T2.item from table1 T1
inner join table2 T2 on T1.Usid = T2.usid
inner join table3 T3 on T2.itemID =T3.itemID) A left join

(select B.RName,C.itemName,count(itemName) 完成次数 from TableA A 
inner join TableB B on A.did =B.did
inner join TableC C on A.did=C.did
group by b.RName,C.itemName) B on A.UName =B.RName and A.itemName=B.itemName where A.UName='张三'

--结果集
--张三搬箱子32
--张三搬电脑70


[解决办法]
引用:
引用:SQL code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182……


--查询每个人最终完成的次数
select B.RName,C.itemName,count(itemName) 完成次数 from TableA A 
inner join TableB B on A.did =B.did
inner join TableC C on A.did=C.did
group by b.RName,C.itemName

--执行结果
--李四搬箱子2
--张三搬箱子2
--李四搬椅子2
--张三搬椅子3

热点排行