一个分类统计的问题,有点复杂
现有表 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 行)
*/