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

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 托盘,纸箱
...全文
449 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
内容概要:本文围绕基于粒子群算法(PSO)的风电与水电(抽水蓄能)联合优化调度问题展开研究,旨在通过智能优化算法实现可再生能源的高效利用与电力系统的经济稳定运行。文系统阐述了粒子群算法的核心原理及其在电力调度的适用性,构建了综合考虑风电出力不确定性、抽水蓄能电站调节能力及系统运行约束的联合优化调度模型。采用Matlab进行算法编程与仿真求解,验证了该方法在降低系统综合运行成本、提升新能源消纳水平、增强电网调峰调频能力等方面的优越性能。研究进一步设计了多种对比场景,分析不同调度策略下的系统表现,充分展示了所提模型在应对复杂运行条件时的鲁棒性与实用价值。; 适合人群:具备一定电力系统分析基础和Matlab编程能力的研究生、科研人员,以及从事新能源并网调度、电力系统规划与运行等相关领域的工程师; 使用场景及目标:①应用于风电场与抽水蓄能电站的协同优化调度决策支持;②为高比例可再生能源接入的电力系统提供经济可靠的低碳调度方案;③服务于高校及科研院所关于智能优化算法在能源系统应用的教学与科研实验; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节与模型构建逻辑,重点关注目标函数设计、约束条件处理及参数设置对优化结果的影响,并通过复现仿真结果来掌握粒子群算法解决复杂非线性调度问题的关键技术要点。

27,579

社区成员

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

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