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

一个分类统计的有关问题,有点复杂

2012-01-08 
一个分类统计的问题,有点复杂现有表t_就餐记录字段如下:姓名就餐日期饭店名称id(自增列)张三2007-01-01百

一个分类统计的问题,有点复杂
现有表   t_就餐记录
字段如下:
姓名           就餐日期                   饭店名称       id(自增列)
张三2007-01-01百福楼   1
李四2007-01-01百福楼   2
张三2007-05-01梅园   3
刘德华2007-05-01梅园   4
刘德华2007-06-01幼儿园   5
张三2007-06-01幼儿园   6
周润发2007-06-01幼儿园   7

想统计出来,在一起吃过两次饭以上的人员(两人,或两人以上)

统计出来的格式大概是这个样式
就餐日期         饭店名称         吃饭人员
2007-05-01     梅园                 刘德华,张三
2007-06-01     幼儿园             刘德华,张三

或者其他格式也可以,只要能看出是是一起吃过两次饭以上的人员就可以了

先谢谢了

[解决办法]
create table t_就餐记录(姓名 varchar(20),就餐日期 datetime ,饭店名称 varchar(50) , id int)
insert t_就餐记录
select '张三 ', '2007-01-01 ', '百福楼 ', 1
union select '李四 ', '2007-01-01 ', '百福楼 ', 2
union select '张三 ', '2007-05-01 ', '梅园 ', 3
union select '刘德华 ', '2007-05-01 ', '梅园 ', 4
union select '刘德华 ', '2007-06-01 ', '幼儿园 ', 5
union select '张三 ', '2007-06-01 ', '幼儿园 ', 6
union select '周润发 ', '2007-06-01 ', '幼儿园 ', 7

go

---用函数
create function f(@dt datetime,@fn varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str= ' '
select @str=@str+ ', '+姓名 from t_就餐记录 where 就餐日期=@dt and 饭店名称=@fn
set @str=stuff(@str,1,1, ' ')
return @str
end

go


select 就餐日期,饭店名称,吃饭人员=dbo.f(就餐日期,饭店名称)
from t_就餐记录
group by 就餐日期,饭店名称


drop table t_就餐记录
drop function dbo.f

/* 结果


就餐日期 饭店名称 吃饭人员
------------------------------------------------------ -------------------------------------------------- ----------------------------------------------------------------------------------------------------------------
2007-01-01 00:00:00.000 百福楼 李四,张三
2007-05-01 00:00:00.000 梅园 刘德华,张三
2007-06-01 00:00:00.000 幼儿园 刘德华,张三,周润发

(3 row(s) affected)

*/
[解决办法]
学习!
[解决办法]
create table test(姓名 varchar(20),就餐日期 varchar(20),饭店名称 varchar(20),id int)
insert into test select '张三 ', '2007-01-01 ', '百福楼 ',1
insert into test select '李四 ', '2007-01-01 ', '百福楼 ',2
insert into test select '张三 ', '2007-05-01 ', '梅园 ',3
insert into test select '刘德华 ', '2007-05-01 ', '梅园 ',4
insert into test select '刘德华 ', '2007-06-01 ', '幼儿园 ',5


insert into test select '张三 ', '2007-06-01 ', '幼儿园 ',6
insert into test select '周润发 ', '2007-06-01 ', '幼儿园 ',7
go

create function f_str(@date varchar(20),@restaurant varchar(20))
returns varchar(200)
as
begin
declare @ret varchar(200)
set @ret= ' '

declare @t table(姓名 varchar(20),就餐日期 varchar(20),饭店名称 varchar(20))

insert into @t
select
distinct a.姓名,a.就餐日期,a.饭店名称
from
test a,test b
where
a.姓名=b.姓名 and a.饭店名称 <> b.饭店名称 and a.就餐日期 <> b.就餐日期
and
a.饭店名称=@restaurant and a.就餐日期=@date
and
exists(select
1
from
test c
where
c.姓名 <> a.姓名 and c.饭店名称=a.饭店名称 and 就餐日期=a.就餐日期
and
exists(select
1
from
test
where
姓名=c.姓名 and 饭店名称=b.饭店名称 and 就餐日期=b.就餐日期))

select @ret=@ret+ ', '+姓名 from @t

set @ret=stuff(@ret,1,1, ' ')

return @ret
end
go

select
a.就餐日期,a.饭店名称,dbo.f_str(a.就餐日期,a.饭店名称) as 姓名
from
test a
group by
a.就餐日期,a.饭店名称
having
charindex( ', ',dbo.f_str(a.就餐日期,a.饭店名称))> 0 --调用了两次函数,效率也不高
go

/*
就餐日期 饭店名称 姓名
-------------------- -------------------- --------------------
2007-05-01 梅园 刘德华,张三
2007-06-01 幼儿园 刘德华,张三
*/

drop function f_str
drop table test
go
[解决办法]
---统计的是一起吃过两次饭以上的人员
---借用楼上的数据
create table test(姓名 varchar(20),就餐日期 varchar(20),饭店名称 varchar(20),id int)
insert into test select '张三 ', '2007-01-01 ', '百福楼 ',1
insert into test select '李四 ', '2007-01-01 ', '百福楼 ',2
insert into test select '张三 ', '2007-05-01 ', '梅园 ',3
insert into test select '刘德华 ', '2007-05-01 ', '梅园 ',4
insert into test select '刘德华 ', '2007-06-01 ', '幼儿园 ',5
insert into test select '张三 ', '2007-06-01 ', '幼儿园 ',6
insert into test select '周润发 ', '2007-06-01 ', '幼儿园 ',7
Go

---查询统计的是一起吃过两次饭以上的人员姓名
Select Distinct 姓名 From test As A Where Exists
(Select 1 From test Where 姓名=A.姓名 And id <A.id Group By 姓名,饭店名称)
---清除测试环境
Drop Table test

---结果
/*
姓名
--------------------
刘德华
张三

(所影响的行数为 2 行)
*/

热点排行