分类汇总 合并到一个字段中

u1lixin 2011-07-18 08:59:20
SQL2005表tab中有下列数据:
id 业务编号 件数 包装
1 s1 2 托盘
2 s1 3 纸箱
3 s1 3 托盘
怎样在视图中相同业务编号显示成一行
业务编号 件数 包装
s1 2,3,3 托盘,纸箱,托盘
如果是下表就更好了,tab表中包装不确定是动态的。
业务编号 件数 包装
s1 5,3 托盘,纸箱
...全文
400 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cd731107 2011-07-20
  • 打赏
  • 举报
回复
select 业务编号,
包装=stuff((select ','+ltrim(tb1.name) from tab, tb1 where tab.id=tb1.id and 业务编号=a.业务编号 for xml path('')),1,1,'')
FROM tag a group by 业务编号
u1lixin 2011-07-19
  • 打赏
  • 举报
回复
你好,再请教下昨天的问题
select 业务编号,
包装=stuff((select ','+ltrim(包装) from tab where 业务编号=a.业务编号 for xml path('')),1,1,'')
FROM tag a group by 业务编号
这里的包装字段,用的是另一张表里的ID
id name
1001 纸箱
1002 托盘
上面的结果显示为:1001,1002
我想显示成:纸箱,托盘
怎么做,试了很多语句都不行
cd731107 2011-07-19
  • 打赏
  • 举报
回复
检查了一下,不是没起别名,没看出什么问题
cd731107 2011-07-19
  • 打赏
  • 举报
回复
是不是没给子查询起一个别名?
u1lixin 2011-07-18
  • 打赏
  • 举报
回复
没错,是其他问题,找到了
u1lixin 2011-07-18
  • 打赏
  • 举报
回复
多谢指点,再请教下;
执行这个语句没错

SELECT BILLID,INVOICENO=stuff((select ','+ltrim(INVOICENO) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,''),zhongwenpinming=stuff((select ','+ltrim(zhongwenpinming) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,'') FROM SCM_dingdan3 qq group by BILLID


放在视图中,执行就错了

LEFT JOIN (SELECT BILLID,INVOICENO=stuff((select ','+ltrim(INVOICENO) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,''),zhongwenpinming=stuff((select ','+ltrim(zhongwenpinming) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,'') FROM SCM_dingdan3 qq group by BILLID) D ON D.BILLID=B.BillID 
u1lixin 2011-07-18
  • 打赏
  • 举报
回复
多谢指点,再请教下;
执行这个语句没错
SELECT BILLID,INVOICENO=stuff((select ','+ltrim(INVOICENO) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,''),zhongwenpinming=stuff((select ','+ltrim(zhongwenpinming) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,'') FROM SCM_dingdan3 qq group by BILLID

放在视图中,执行就错了
LEFT JOIN (SELECT BILLID,INVOICENO=stuff((select ','+ltrim(INVOICENO) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,''),zhongwenpinming=stuff((select ','+ltrim(zhongwenpinming) from SCM_dingdan3 where BILLID=qq.BILLID for xml path('')),1,1,'') FROM SCM_dingdan3 qq group by BILLID) D ON D.BILLID=B.BillID
cd731107 2011-07-18
  • 打赏
  • 举报
回复
select 业务编号,
件数=stuff((select ','+ltrim(件数) from tab where 业务编号=a.业务编号 for xml path('')),1,1,''),
包装=stuff((select ','+ltrim(包装) from tab where 业务编号=a.业务编号 for xml path('')),1,1,'')
FROM tag a group by 业务编号
--小F-- 2011-07-18
  • 打赏
  • 举报
回复
合并列值 
--*******************************************************************************************
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--=============================================================================
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
--1. 创建处理函数
CREATE FUNCTION dbo.f_strUnite(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id
drop table tb
drop function dbo.f_strUnite
go
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
--===================================================================================
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), ' <N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/

--SQL2005中的方法2
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id

/*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc

(2 row(s) affected)

*/

drop table tb

27,580

社区成员

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

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