急!!在线等!高分求助各位sql精英,一条SQL汇总语句,功力好的请进!

sonicryu 2013-06-25 12:34:05

求教CSDN的各位SQL技术达人指点迷津。

手上有组数据需要合并,求一条SQL语句,对一组数据进行汇总合并,

数据如下:

表A

ID 主机 资产名称 金额 备注 编号 数量 日期

1 主机 会议桌 1000.56 会议用 QC1 4 1990-1-1
1 null 屏风 2000 屏风配件 QC2 2 1992-1-1
2 主机 E卓 2000.33 111 QC3 5 1990-1-1
2 null 桌板 500 222 QC4 3 1982-1-1
2 null 桌脚 500 333 QC5 10 2000-1-1
2 null 电话 500 444 QC6 1 2010-1-1
3 主机 员工办公桌 5000.22 aa QC7 8 1988-1-1
3 null 活动椅 2000.11 bb QC8 1 2001-1-1
3 null 键盘架 1000.55 cc QC9 1 2005-1-1

.....
.....


现求一条sql语句,查询后想要得到如下结果:


ID 主机 资产名称 金额 备注 编号 数量 日期
1 1 会议桌 3000.56 会议用,屏风配件 QC1,QC2 4 1990-1-1
2 1 E卓 3500.33 111,222,333,444 QC3,QC4,QC5,QC6 5 1990-1-1
3 1 员工办公桌 8000.88 aa,bb,cc QC7,QC8,QC9 8 1988-1-1


主要功能:

1.将ID相同的数据进行合并
2.资产名称 等于 主机的资产名称
3.金额 等于 ID相同的记录的金额求和
4.备注 等于 ID相同的记录的备注信息 的合并,用逗号隔开。
5.编号同备注
6.其余信息默认为主机信息

请教各位高手该如何实现?
...全文
157 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonicryu 2013-06-25
  • 打赏
  • 举报
回复
CREATE FUNCTION dbo.f_bz(@id int ) RETURNS varchar(8000) AS BEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ' ' + [备注] FROM jj WHERE [合并序号]=@id RETURN STUFF(@r, 1, 1, '') END GO CREATE FUNCTION dbo.f_zc(@id int ) RETURNS varchar(8000) AS BEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ' ' + [资产名称] FROM jj WHERE [合并序号]=@id RETURN STUFF(@r, 1, 1, '') END GO CREATE FUNCTION dbo.f_kp(@id int) RETURNS varchar(8000) AS BEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ',' + [卡片编号] FROM jj WHERE [合并序号]=@id RETURN STUFF(@r, 1, 1, '') END GO ---------------------------------------------------------------------------- select [合并序号]=(SELECT TOP 1 [合并序号] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'), [主件序号]=(SELECT TOP 1 [主件序号] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'), [审核状态]=(SELECT TOP 1 [审核状态] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'), [资产名称]=(SELECT TOP 1 [资产名称] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'), dbo.f_zc(a.合并序号) as 资产组成, dbo.f_bz(a.合并序号) as 备注, [价值]=SUM([价值]), [数量]=(SELECT TOP 1 [数量] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'), dbo.f_kp(a.合并序号) as 卡片编号 from jj a group by 合并序号 order by 合并序号 ---------------------------------------------------------------------------- 请教各位大神这样写的话是否正确呢? 2.如果后面还有20个字段格式和数量一样,能否不用再重复写代码呢? [数量]=(SELECT TOP 1 [数量] FROM jj WHERE 合并序号=a.合并序号 AND [主件序号]='1'),
sonicryu 2013-06-25
  • 打赏
  • 举报
回复
SQL2000的语句应该如何写呢
sonicryu 2013-06-25
  • 打赏
  • 举报
回复
CREATE FUNCTION dbo.f_s1(@id int) RETURNS varchar(8000) AS BEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ',' + value FROM @表A WHERE id=@id RETURN STUFF(@r, 1, 1, '') END GO CREATE FUNCTION dbo.f_s2(@id int) RETURNS varchar(8000) AS BEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ',' + value FROM @表A WHERE id=@id RETURN STUFF(@r, 1, 1, '') END GO 请您看看这样行吗,那SQL语句应该怎么写呢
叶子 2013-06-25
  • 打赏
  • 举报
回复
把备注和编号改成两个自定义函数就可以了。 SQL SERVER 2000不支持for xml path 参考: http://www.cnblogs.com/hanmos/archive/2011/09/15/2177391.html
sonicryu 2013-06-25
  • 打赏
  • 举报
回复
服务器: 消息 170,级别 15,状态 1,行 17 第 17 行: 'xml' 附近有语法错误。 服务器: 消息 156,级别 15,状态 1,行 18 在关键字 'for' 附近有语法错误。 服务器: 消息 170,级别 15,状态 1,行 19 第 19 行: ',' 附近有语法错误。 服务器: 消息 156,级别 15,状态 1,行 21 在关键字 'from' 附近有语法错误。 是不是SQL2000的关系?
叶子 2013-06-25
  • 打赏
  • 举报
回复

--> 测试数据:@表A
declare @表A table([ID] int,[主机] varchar(4),[资产名称] varchar(10),[金额] numeric(6,2),[备注] varchar(8),[编号] varchar(3),[数量] int,[日期] datetime)
insert @表A
select 1,'主机','会议桌',1000.56,'会议用','QC1',4,'1990-1-1' union all
select 1,null,'屏风',2000,'屏风配件','QC2',2,'1992-1-1' union all
select 2,'主机','E卓',2000.33,'111','QC3',5,'1990-1-1' union all
select 2,null,'桌板',500,'222','QC4',3,'1982-1-1' union all
select 2,null,'桌脚',500,'333','QC5',10,'2000-1-1' union all
select 2,null,'电话',500,'444','QC6',1,'2010-1-1' union all
select 3,'主机','员工办公桌',5000.22,'aa','QC7',8,'1988-1-1' union all
select 3,null,'活动椅',2000.11,'bb','QC8',1,'2001-1-1' union all
select 3,null,'键盘架',1000.55,'cc','QC9',1,'2005-1-1'

select 
	ID ,[主机]=(SELECT COUNT([主机]) FROM @表A WHERE id=a.id),
	[资产名称]=(SELECT TOP 1 [资产名称] FROM @表A WHERE id=a.id AND [主机]='主机'),
	[金额]=SUM([金额]),
	[备注]=stuff((select ','+[备注] from @表A t where a.id=t.id for xml path('')), 1, 1, ''),
	[编号]=stuff((select ','+[编号] from @表A t where a.id=t.id for xml path('')), 1, 1, ''),
	[数量]=(SELECT TOP 1 [数量] FROM @表A WHERE id=a.id AND [主机]='主机'),
	[日期]=(SELECT TOP 1 [日期] FROM @表A WHERE id=a.id AND [主机]='主机')
from @表A a group by id

22,210

社区成员

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

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