怎样用SQL语句实现以下转换

图片说明
如图所示,第一张图是数据库中查询出来的形式,想使用SQL语句写成第二种形式。
就是表中有多个用户,每个用户的记录条数不相等。(例如小明有两条记录,小红一条)。现在想将同一个用户的多条行记录内容,变成列展示,放在同一行中。小红只有一条记录,后面列的字段内容就为空。
请问各位,怎么查询才能实现上图的转换。

select a.姓名 '姓名',a.名称 '名称1' , a.价格 '价格1' b.名称 '名称2' b.价格 '价格2'
from t a left join t b on a.姓名=b.姓名

你这种格式,很难实现转换。
但是可以转换成这种格式
图片说明

请问要实现怎样的功能,这种很影响查询的效率,建议改成程序实现

我有一个问题想请教楼主,你最终要实现的这个结构,为什么把A和C放在同一列,这是我很纳闷的地方,按理来说,你的名称总数量是固定的啊,你应该是同一名称放在同一列啊,然后列名就是你的名称,这样统计应该是效果最好的。

需要进行转置:

需要用到:STUFF函数。

就好比:
要求将FoodRoom中值相同的字段合并成一行,并将name的值用逗号隔开。

查询语句如下:

select FoodRoom,
stuff((select ','+name from MACook

where c.FoodRoom=FoodRoom
for xml path('')),1,1,'') as CookNames

from MACook c

group by c.FoodRoom

楼主对比着试下。

DECLARE @tb1 TABLE(c_name1 VARCHAR(10),c_name2 VARCHAR(10),c_price DECIMAL(6,2))
INSERT @tb1 SELECT '小明','A',10
UNION ALL SELECT '小明','B',25
UNION ALL SELECT '小明','C',30
UNION ALL SELECT '小红','A',20

DECLARE @tb2 TABLE(c_name1 VARCHAR(10),u_all VARCHAR(1000))
INSERT @tb2 SELECT c_name1,c_name2 + ',' + cast(c_price as char(10)) FROM @tb1

DECLARE @col1 VARCHAR(20),@col2 VARCHAR(8000)

UPDATE @tb2 SET @col2 = (CASE WHEN @col1 = rtrim(c_name1) THEN rtrim(@col2) + ',' + rtrim(u_all) ELSE u_all END),
@col1 = c_name1,u_all = @col2
DECLARE @i INT ,@s VARCHAR(1000)
SET @i = 0
SELECT c_name1,MAX(u_all) col INTO #t FROM @tb2 GROUP BY c_name1
WHILE @@rowcount > 0
BEGIN
SELECT @i = @i + 1,

@s = 'ALTER TABLE #t ADD col' + CAST(@i AS VARCHAR) + ' VARCHAR(10)'
EXEC(@s)
SET @s='UPDATE #t SET col' + CAST(@i AS VARCHAR) + '= LEFT(col,CHARINDEX('','',col + '','') - 1),
col = STUFF(col,1,CHARINDEX('','',col + '',''),'''')
WHERE col > '''''
EXEC(@s)
END
SET @s = 'ALTER TABLE #t DROP COLUMN col,col' + cast(@i AS VARCHAR)
EXEC(@s)
SELECT * FROM #t
DROP TABLE #t

在SQL SERVER200下测试成功
结果如下:
![图片说明](https://img-ask.csdn.net/upload/201905/08/1557315506_504433.jpg)