已知表结构如下:
Name 个数 数量
张三 2 3
李四 3 3
用SQL 怎么能实现 如下结果
Name 个数 数量 结果
张三 2 3 3,3
李四 3 3 3,3,3
------解决方案--------------------
- SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([Name] VARCHAR(4),[个数] INT,[数量] INT)INSERT [tb]SELECT '张三',2,3 UNION ALLSELECT '李四',3,3--------------开始查询--------------------------;WITH t AS(SELECT b.[Name],[个数],[数量] FROM [tb] AS b ,MASTER..spt_values AS s WHERE s.number BETWEEN 1 AND b.[个数]AND s.type='P')SELECT *,结果=STUFF((SELECT ','+LTRIM([数量]) FROM t WHERE [Name]=a.[Name] FOR XML PATH('')),1,1,'') FROM t AS aGROUP BY [Name],[个数],[数量]----------------结果----------------------------/* Name 个数 数量 结果李四 3 3 3,3,3张三 2 3 3,3*/
------解决方案--------------------
- SQL code
create table tb(name nvarchar(10),个数 int,数量 int)insert into tb select N'张三',2,3 union select N'李四',3,3select a.*,结果=stuff((select ','+rtrim(m.数量) from tb m,master..spt_values where 个数>number and type='p' and m.name=a.name for xml path('')),1,1,'') from tb a /*name 个数 数量 结果---------- ----------- ----------- ----------张三 2 3 3,3李四 3 3 3,3,3
------解决方案--------------------
- SQL code
;WITH C1(Name, 个数, 数量) as( SELECT '张三', 2, 3 UNION ALLSELECT '李四', 3, 3 )SELECT Name, 个数, CASE WHEN 个数>0 THEN STUFF(REPLICATE(';'+CAST(个数 AS varchar(10))+'', 个数),1,1,'') ELSE NULL END 数量from c1
------解决方案--------------------
哎呀 没抢到啊
哎……
- SQL code
/*Name 个数 数量---- ----------- ------张三 2 2;2李四 3 3;3;3*/
------解决方案--------------------
- SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([Name] VARCHAR(4),[个数] INT,[数量] INT)INSERT [tb]SELECT '张三',2,3 UNION ALLSELECT '李四',3,3SELECT *,LEFT(REPLICATE(LTRIM(数量)+',',个数),LEN(REPLICATE(LTRIM(数量)+',',个数))-1) AS 结果 FROM TB/*张三 2 3 3,3李四 3 3 3,3,3(所影响的行数为 2 行)
------解决方案--------------------
------解决方案--------------------