高难问题,在线等,把列变成字段名

hksl 2005-12-20 02:57:45
a表
运输单号 提单号 费用名称 金额
a00001 d002 铁路运费 1500
a00001 d002 装卸费 2000
a00001 d002 场地费 1500
a00002 d005 铁路运费 5500
a00002 d005 装卸费 500
a00002 d005 管理费 5500
a00002 d005 服务费 500

要想得到
运输单号 提单号 铁路运费 装卸费 场地费 管理费 服务费
a00001 d002 1500 2000 1500 0 0
a00002 d005 5500 500 0 5500 500

表的费用名称 不是固定的, 有多少费用名称 就作为字段名
求救高手,分不够再给
...全文
249 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingyuebin 2005-12-20
  • 打赏
  • 举报
回复
declare @s varchar(8000)
set @s = 'select 运输单号'
select @s=@s+',sum(case 费用名称 when'''+费用名称+'''then 金额 else 0 end)['+费用名称+']' from
(select distinct 费用名称 from a表) as a
--select @s
set @s=@s+'from a表 group by 运输单号'
exec (@s)
hksl 2005-12-20
  • 打赏
  • 举报
回复

加入了quotename 就没问题了
谢谢
子陌红尘 2005-12-20
  • 打赏
  • 举报
回复
quotename()处理一下列名:
------------------------------------------------------------------------------------------------------------------------------------
declare @s varchar(8000)
set @s = ''
select @s = @s+','+quotename(费用名称)+'=sum(case 费用名称 when '''+费用名称+''' then 金额 else 0 end)'
from a表 group by 费用名称 order by 费用名称
set @s = 'select 运输单号,提单号'+@s+' from a表 group by 运输单号,提单号 order by 运输单号,提单号'
exec(@s)
子陌红尘 2005-12-20
  • 打赏
  • 举报
回复
楼主把半角的"()"写成了全角的"()"了吧?
OracleRoob 2005-12-20
  • 打赏
  • 举报
回复
^_^
刚以为是长度不够
现在我查了下 len(@s)=1568
执行后的提示

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '(' 附近有语法错误。

-------------------------

一定是费用名称中带有非法字符
mislrb 2005-12-20
  • 打赏
  • 举报
回复
费用有9万项??!,也太乱收费了

用上面的动态SQL都不行的话,那只有想办法生成几个表,然后再连接了
hksl 2005-12-20
  • 打赏
  • 举报
回复
^_^
刚以为是长度不够
现在我查了下 len(@s)=1568
执行后的提示

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '(' 附近有语法错误。
OracleRoob 2005-12-20
  • 打赏
  • 举报
回复
但是我记录有上9几万条数据
用你这个通不过
varchar(8000)
都小了

-------------------------
declare @s varchar(8000)

8000还不够啊
9万多条,类别有几千种吗?


lsqkeke 2005-12-20
  • 打赏
  • 举报
回复
楼主都说费用名称种类不定的了!
hksl 2005-12-20
  • 打赏
  • 举报
回复
费用名称很多
而且费用名称不确定
虽用户怎么设定就怎么设定
hksl 2005-12-20
  • 打赏
  • 举报
回复
但是我记录有上9几万条数据
用你这个通不过
varchar(8000)
都小了
lsgis2001 2005-12-20
  • 打赏
  • 举报
回复
最多有几种费用知道吧!!!如果这也不知道就不好做了,
如果最多有3种就这么写了。
select a.运输单号,a.提货号,t1.费用1,t2.费用2,t3.费用3
from a left join a t1 on a.运输单号=t1.运输单号 and a.提货号=t1.提货号
join a t2 on a.运输单号=t2.运输单号 and a.提货号=t2.提货号
join a t3 on a.运输单号=t3.运输单号 and a.提货号=t3.提货号
试试吧,这只是个思路,好长时间没写过了。不知道语法上是不是有错误,请指正。
hksl 2005-12-20
  • 打赏
  • 举报
回复
最好
hksl 2005-12-20
  • 打赏
  • 举报
回复
做好视图可以完成
子陌红尘 2005-12-20
  • 打赏
  • 举报
回复
declare @s varchar(8000)
set @s = ''
select @s = @s+','+费用名称+'=sum(case 费用名称 when '''+费用名称+''' then 金额 else 0 end)'
from a表 group by 费用名称 order by 费用名称
set @s = 'select 运输单号'+@s+' from a表 group by 运输单号 order by 运输单号'
exec(@s)
hksl 2005-12-20
  • 打赏
  • 举报
回复
游标可能速度太慢了 不过也可以
浩方软件HFWMS 2005-12-20
  • 打赏
  • 举报
回复
用cursor行么

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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