PID PName PAmount PAddress
aaa1 张三 10000 四川省
aaa1 李四 20000 四川省
aaa1 王五 30000 四川省结果:ID PID PName PAmount PAdress
row_number aaa1 张三、李四、王五 60000 四川省
本来解决的思路:
将数据根据PID order by ,然后一一比对。因为查询条件很多,这样order by 了 会冲突其他条件上的order by 不可行。
aaa1 张三 10000 四川省
aaa1 李四 20000 四川省
aaa1 王五 30000 四川省结果:ID PID PName PAmount PAdress
row_number aaa1 张三、李四、王五 60000 四川省
本来解决的思路:
将数据根据PID order by ,然后一一比对。因为查询条件很多,这样order by 了 会冲突其他条件上的order by 不可行。
解决方案 »
- 在存储过程中如何判断参数是字母还是数字
- SQL脚本,表结构生成excel
- 刚刚换了SQL 2008 ,请教一个问题
- 存储过程中使用xquery的问题
- ms sql server sql语句问题
- 怎样识别我安装的SQL SERVER2000数据库是不是服务器版的还是个人版?
- SQL SERVER 2000的Windows集成身份验证的问题,连接数据库失败,郁闷!!!!!!!!
- 关于两个表的数据连接问题
- 如何在数据库存储、读取单引号以及一些特殊字符
- sql如何添加新列
- 使用ADO远程连接SQL Server 成功后,网络发生中断后,为何_ConnectionPtr::Open()方法还返回成功,直到10分钟后才返回失败
- 工作十年存疑——存储过程OR多层结构
create table #tab(PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))
insert into #tab
select 'aaa1', '张三', 10000, '四川省' union all
select 'aaa1', '李四', 20000, '四川省' union all
select 'aaa1', '王五', 30000, '四川省'select ROW_NUMBER()over(order by PID)id,PID,
(select stuff((
select ','+PName from #tab for xml path('')),1,1,''))PName,
sum(PAmount)PAmount,
PAddress
from #tab
group by PID,PAddress
---------------------------------------------------------------------
id PID PName PAmount PAddress
-------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- --------------------------------------------------
1 aaa1 张三,李四,王五 60000 四川省(1 行受影响)
create table tab
(PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))insert into tab
select 'aaa1', '张三', 10000, '四川省' union all
select 'aaa1', '李四', 20000, '四川省' union all
select 'aaa1', '王五', 30000, '四川省'godrop function fn_mergeSTR
gocreate function dbo.fn_mergeSTR
(@pid varchar(50),@paddress varchar(50),@split varchar(10))
returns varchar(300)
as
begin
declare @str varchar(300);
set @str = '';
select @str = @str + pname + @split
from tab
where pid = @pid
and paddress = @paddress
set @str = left(@str , len(@str) - LEN(@split) )
return @str --返回值
end
go
select row_number() over(order by pid ) as id,
pid,
dbo.fn_mergeSTR(pid,paddress,',') as pname,
sum(pamount) pamount,
paddress
from tab
group by pid,
paddress/*
id pid pname pamount paddress
1 aaa1 张三,李四,王五 60000 四川省
*/
declare @t varchar(55)
set @t=''
select @t=@t+','+pname from province
set @t=stuff(@t,1,1,'')select pid,paddress,sum(pamount),@t from province group by pid,paddress
AS (
SELECT 'aaa1', N'张三', 10000, N'四川省' UNION ALL
SELECT 'aaa1', N'李四', 20000, N'四川省' UNION ALL
SELECT 'aaa1', N'王五', 30000, N'四川省' UNION ALL
SELECT 'aaa2', N'小刚', 40000, N'北京' UNION ALL
SELECT 'aaa2', N'小敏', 30000, N'北京' UNION ALL
SELECT 'aaa3', N'小王', 40000, N'内蒙'
)
SELECT ROW_NUMBER() OVER(ORDER BY A.PID) AS ID
,A.PId
,STUFF((SELECT ','+Pname
FROM CTE
WHERE PId=A.PId
FOR XML PATH('')),1,1,'')
,SUM(A.PAmount) AS PAmount
,A.PAddress
FROM CTE AS A
GROUP BY A.PId,A.PAddress
create table #tab(PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))
insert into #tab
select 'aaa1', '张三', 10000, '四川省' union all
select 'aaa1', '李四', 20000, '四川省' union all
select 'aaa1', '王五', 30000, '四川省';with ceb as
(
select Row_number() over( order by PID desc) as RN,PID,
(stuff((select (','+PName) from #tab a where a.PID=b.PID for xml path('')),1,1,'')) as PName,
SUM(PAmount) as PAmount,PAddress
from #tab b group by PID,PAddress
)
select * from ceb
可以略做修改: declare @t varchar(55)
set @t=''
select @t=isnull(@t+',','')+pname from province
select pid,paddress,sum(pamount),@t from province group by pid,paddress
可以略做修改: declare @t varchar(55)
set @t=''
select @t=isnull(@t+',','')+pname from province
select pid,paddress,sum(pamount),@t from province group by pid,paddress
你这样可以吗? 算出来的@t是这个表里的所有行的pname的拼接,而不是按pid分组的行的pname的拼接