什么SQL语句能否输出这样的结果,或者说怎样最高效的输出这样的结果,谢谢!

snailili 2003-11-11 11:04:44
就是输出一个综合查询的信息,我想你们应该接触过类似的情况...

首先,一些简单的表联接--
客户公司名录表,联接市场交易表,联接后总表基本结构为:
表A
公司名 公司id 交易id 交易日期 交易产品
A 11 1 2003-3-3 咖啡
A 11 2 2003-4-3 手纸
A 11 3 2003-5-3 大米
b 10 4 2003-7-3 win98se
b 10 5 2003-1-3 鸟人
c 12 6 2003-2-3 狗屁

然后,需要输出的浏览信息:--
表B
公司名 公司id 交易日期 交易产品
A 11 3、4、5 win98se,手纸,大米
b 10 1、7 彩笔,鸟人
c 12 2 狗屁

即简洁明了的看到哪些客户公司在哪些月份进行过交易,
如果上一步可行的话,再考虑显示出具体交易的产品.
我不知道一个SQL语句可否达到要求,如果不行的话就两三个吧,

注:
我用的开发工具是ASP,这个页面的查询量要尽可能大,
如果用ASP的ADO来遍历+判断,效率可能会很低
所以我想在SQL里面处理好以后直接输出表B,
请大家考虑一下,给个方案(一定要考虑效率问题!!!)
...全文
25 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabbit9 2003-11-12
  • 打赏
  • 举报
回复
很难嘛,实现总是可以的嘛。方法很多的。多想想
snailili 2003-11-11
  • 打赏
  • 举报
回复
谢谢你们几位大佬 :)
我资质不行,得先慢慢消化一下,过两天结贴。
zjcxc 2003-11-11
  • 打赏
  • 举报
回复
--下面是数据测试

--创建数据测试环境
create table t1(公司名 char(10),公司id int,交易id int,交易日期 datetime,交易产品 varchar(20))
insert t1 select 'A',11,1,'2003-3-3','咖啡'
union all select 'A',11,2,'2003-4-3','手纸'
union all select 'A',11,3,'2003-5-3','大米'
union all select 'b',10,4,'2003-7-3','win98se'
union all select 'b',10,5,'2003-1-3','鸟人'
union all select 'c',12,6,'2003-2-3','狗屁'
go

--创建自定义合并函数
create function f_merg(@fd sysname,@id int)
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
if @fd='交易日期'
select @re=@re+','+cast(month(交易日期) as varchar) from t1 where 公司id=@id order by 交易日期
else
select @re=@re+','+交易产品 from t1 where 公司id=@id order by 交易日期
set @re=substring(@re,2,8000)
return(@re)
end
go

--调用自定义函数得到结果
select 公司名,公司id
,交易日期=dbo.f_merg('交易日期',公司id)
,交易产品=dbo.f_merg('交易产品',公司id)
from t1 group by 公司名,公司id

go

--删除数据测试环境
drop table t1
drop function f_merg


/*--测试结果
公司名 公司id 交易日期 交易产品
---------- ----------- -------------------- --------------------
A 11 3,4,5 咖啡,手纸,大米
b 10 1,7 鸟人,win98se
c 12 2 狗屁

(所影响的行数为 3 行)
--*/
zjcxc 2003-11-11
  • 打赏
  • 举报
回复
--上面的函数有些小错,调整一下:

--创建自定义合并函数
create function f_merg(@fd sysname,@id int)
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
if @fd='交易日期'
select @re=@re+','+cast(month(交易日期) as varchar) from t1 where 公司id=@id order by 交易日期
else
select @re=@re+','+交易产品 from t1 where 公司id=@id order by 交易日期
set @re=substring(@re,2,8000)
return(@re)
end
go
zjcxc 2003-11-11
  • 打赏
  • 举报
回复
--一个自定义的合并函数就可以了.
create function f_merg(@fd sysname,@id int)
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
if @fd='交易日期'
select @re=@re+','+cast(day(交易日期) as varchar) from t1 where 公司id=@id
else
select @re=@re+','+交易产品 from t1 where 公司id=@id
set @re=substring(@re,2,8000)
return(@re)
end
go
txlicenhe 2003-11-11
  • 打赏
  • 举报
回复
create table t1(公司名 char(10),公司id int,交易id int,交易日期 datetime,交易产品 varchar(20))
insert t1 select 'A',11,1,'2003-3-3','咖啡'
union all select 'A',11,2,'2003-4-3','手纸'
union all select 'A',11,3,'2003-5-3','大米'
union all select 'b',10,4,'2003-7-3','win98se'
union all select 'b',10,5,'2003-1-3','鸟人'
union all select 'c',12,6,'2003-2-3','狗屁'

公司名 公司id 交易日期 交易产品
A 11 3、4、5 win98se,手纸,大米
b 10 1、7 彩笔,鸟人
c 12 2 狗屁



--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+交易产品 from t1 where 公司id=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

create function fmerg1(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+ltrim(rtrim(cast(month(交易日期) as char(2)))) from t1 where 公司id=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct 公司名,公司id,dbo.fmerg1(公司id),dbo.fmerg(公司id) from t1

公司名 公司id
---------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A 11 3,4,5 咖啡,手纸,大米
b 10 7,1 win98se,鸟人
c 12 2 狗屁

(所影响的行数为 3 行)
pengdali 2003-11-11
  • 打赏
  • 举报
回复
是这个:

create function getstr(@content int)
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+'、'+cast(month(交易日期) as varchar(10)) from 你的表 where 公司id=@content
select @str=right(@str,len(@str)-1)
return @str
end
go

create function getstr2(@content int)
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+交易产品 from 你的表 where 公司id=@content
select @str=right(@str,len(@str)-1)
return @str
end
go

--调用:
select 公司名,公司id,dbo.getstr(公司id) 交易日期,dbo.getstr2(公司id) 交易产品 from 你的表 group by 公司名,公司id
pengdali 2003-11-11
  • 打赏
  • 举报
回复
create function getstr(@content int)
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+'、'+rtrim(交易日期) from 你的表 where 公司id=@content
select @str=right(@str,len(@str)-1)
return @str
end
go

create function getstr2(@content int)
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+交易产品 from 你的表 where 公司id=@content
select @str=right(@str,len(@str)-1)
return @str
end
go

--调用:
select 公司名,公司id,dbo.getstr(公司id) 交易日期,dbo.getstr2(公司id) 交易产品 from 你的表 group by 公司名,公司id

txlicenhe 2003-11-11
  • 打赏
  • 举报
回复
如下可以合并交易产品。

--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+交易产品 from 表A where 公司id=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct 公司名,公司id,dbo.fmerg(公司id) from 表A
victorycyz 2003-11-11
  • 打赏
  • 举报
回复
该删掉此贴。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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