如何将每一行转换为具有唯一列

时间:2019-05-16 06:55:00

标签: sql-server

我正在使用SQL Server 2012,并且想要获取有关检查编号和项目名称的csv以便进行市场桶分析;

当前数据输出;

Check No    Item Name
1010000001  3/4 Time Session Ale
1010000001  Aquilani Gls
1010000001  Australian Psycho 50L
1010000001  Bloody Mary
1010000001  Brookvale Ginger Beer
1010000001  Buffalo Trace
1010000001  Café Latte
1010000001  Cake Sparkling Gls
1010000001  Cap
1010000001  Capi Blood Orange
1010000001  Capi Dry Ginger
1010000002  Capi Pink Grapefruit
1010000002  Capi Soda
1010000002  Capi Sparkling Mineral
1010000002  Capi Yuzu
1010000002  Cappucino
1010000002  Carlton Draught
1010000002  Catalina Sounds Gls
1010000002  Chicken Taco
1010000002  Chivas Regal 12 Yr
1010000002  Coke
1010000002  Corona

预期输出;

1010000001 | 3/4 Time Session Ale | Aquilani Gls | Australian Psycho 50L etc

我使用了以下代码;

SELECT [CheckNo], 
       Items = STUFF((SELECT ', ' + [itemModName1]
                      FROM tbl_item AS T1
                      WHERE T1.[CheckNo] = T2.[CheckNo]
                      FOR XML PATH(''), TYPE).value('.[1]', 'varchar(max)'), 1, 1, '')
FROM tbl_item AS T2
GROUP BY [CheckNo];

结果;

它在同一列中为我提供了所有项目,这无济于事。

1 个答案:

答案 0 :(得分:0)

首先,您不清楚“它在同一列中为我提供了所有项目,对我没有帮助。”

通过快速检查您的代码,我发现了两个问题。

  1. GROUP BY不应该在那里。文本的汇总由XML PATH执行。通过使用其他GROUP BY,我希望您的查询不起作用,因为第二列不是聚合函数。
  2. 您使用','作为定界符,长度为2,但是仅在开头以STUFF删除1个字符,这将在开头引起一个空格。不是一件可怕的事,但仍然如此。

所以我建议尝试:

SELECT [CheckNo], 
       Items = STUFF((SELECT ', ' + [itemModName1]
                      FROM tbl_item AS T1
                      WHERE T1.[CheckNo] = T2.[CheckNo]
                      FOR XML PATH(''), TYPE).value('.[1]', 'varchar(max)'), 1, 2, '')
FROM tbl_item AS T2;