这样效果的行列转换如何达到?

zyj_lancao 2010-08-16 09:12:54
日期 车牌号 到达地
2010/01/01 05483 安徽
2010/01/01 05483 江苏
2010/01/01 07110 上海
2010/01/01 08123 杭州


转换为
日期 05483 07110 08123
2010/01/01 安徽 江苏 上海 杭州


交叉表查询需要聚合函数,字符型只能是最大值、最小值之类的,没有合并的,不知如何达到这样的效果,可以
高手会的,感激不尽。只有20分了。
...全文
73 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyj_lancao 2010-08-17
  • 打赏
  • 举报
回复
由于更种原因,我的问题没能直接解决,我于是综合了百年树人和轻骑兵两位的方法,结合自己的情况作了整合,可以达到我查询出的结果,最后的我的问题就是要把执行出来的结果想办法保存在表中,查询出的结果毕竟是动态的,要继续努力了。我很感谢以上两位对我的帮助。
这是我更改后的代码:
alter function f_place(@lice_no varchar(10),@ship_date varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + [到达地] from bb.dbo.tb where [车牌号] = @lice_no and [日期]=@ship_date
set @str = right(@str , len(@str) - 1)
return(@str)
End


declare @sql varchar(8000)
select @sql=isnull(@sql+',','')
+'max(case when 车牌号='''+ 车牌号 +''' then 到达地 else '''' end) as ['+车牌号+']'
from
(select distinct 车牌号 from (SELECT distinct [日期] = CONVERT(VARCHAR(10),[日期],111),[车牌号],[到达地] = master.dbo.f_place([车牌号],CONVERT(VARCHAR(10),[日期],111)) FROM tb )TT) a
set @sql=right(@sql,len(@sql)-1)
-- print @sql
exec ('select convert(varchar(10),日期,111) as 日期,'
+@sql
+' from (SELECT distinct [日期] = CONVERT(VARCHAR(10),[日期],111),[车牌号],[到达地] = master.dbo.f_place([车牌号],CONVERT(VARCHAR(10),[日期],111)) FROM tb )TT group by convert(varchar(10),日期,111)')


zyj_lancao 2010-08-16
  • 打赏
  • 举报
回复
轻骑兵,你好,谢谢你的回复。
我的是sql server 2000
还有就是你的代码,我看的不是很懂。
第一个函数功能是产生一个“[到达地] from tb where [车牌号] = @place ”的语句
而这个“dbo.f_place”sql server 解析为表名
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + [车牌号] from (SELECT [日期] = CONVERT(VARCHAR(10),[日期],120),[车牌号],[到达地] = dbo.f_place([车牌号]) FROM TB )TT GROUP BY [车牌号]
set @sql = '[' + @sql + ']'
--PRINT @sql
exec ('select * from (select * from (SELECT [日期] = CONVERT(VARCHAR(10),[日期],120),[车牌号],[到达地] = dbo.f_place([车牌号]) FROM TB )TT) a pivot (max([到达地]) for [车牌号] in (' + @sql + ')) b')

我是看不懂了,呵呵。
Mr_Nice 2010-08-16
  • 打赏
  • 举报
回复
create function f_place(@place varchar(20)) 
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + [到达地] from tb where [车牌号] = @place
set @str = right(@str , len(@str) - 1)
return(@str)
End
go




declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + [车牌号] from (SELECT [日期] = CONVERT(VARCHAR(10),[日期],120),[车牌号],[到达地] = dbo.f_place([车牌号]) FROM TB )TT GROUP BY [车牌号]
set @sql = '[' + @sql + ']'
--PRINT @sql
exec ('select * from (select * from (SELECT [日期] = CONVERT(VARCHAR(10),[日期],120),[车牌号],[到达地] = dbo.f_place([车牌号]) FROM TB )TT) a pivot (max([到达地]) for [车牌号] in (' + @sql + ')) b')


/*
日期 05483 07110 08123
2010-01-01 安徽,江苏 上海 杭州

*/
百年树人 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
SQL code
---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([日期] datetime,[车牌号] varchar(5),[到达地] varchar(4))
insert [tb]
select '2010/01/01','05483','安徽' union all
……
[/Quote]

不好意思,看错了,还要合并。
Mr_Nice 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 zyj_lancao 的回复:]
日期 车牌号 到达地
2010/01/01 05483 安徽
2010/01/01 05483 江苏
2010/01/01 07110 上海
2010/01/01 08123 杭州


转换为
日期 05483 07110 ……
[/Quote]

lz 05483 的数据是否可以先合并字符串啊。 即 变为2010/01/01 05483 安徽,江苏
百年树人 2010-08-16
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([日期] datetime,[车牌号] varchar(5),[到达地] varchar(4))
insert [tb]
select '2010/01/01','05483','安徽' union all
select '2010/01/01','05483','江苏' union all
select '2010/01/01','07110','上海' union all
select '2010/01/01','08123','杭州'

---查询---
declare @sql varchar(8000)
select
@sql=isnull(@sql+',','')
+'max(case when 车牌号='''+车牌号+''' then 到达地 else '''' end) as ['+车牌号+']'
from
(select distinct 车牌号 from tb) t

exec ('select convert(varchar(10),日期,111) as 日期,'
+@sql
+' from tb group by convert(varchar(10),日期,111)'
)


---结果---
日期 05483 07110 08123
---------- ----- ----- -----
2010/01/01 江苏 上海 杭州

(1 行受影响)

22,207

社区成员

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

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