GVKun编程网logo

在SQL Server中动态将多行合并为多列(sql将多行数据合并为一行)

9

在本文中,我们将给您介绍关于在SQLServer中动态将多行合并为多列的详细内容,并且为您解答sql将多行数据合并为一行的相关问题,此外,我们还将为您提供关于SQL2005合并/将多行合并为一列、SQ

在本文中,我们将给您介绍关于在SQL Server中动态将多行合并为多列的详细内容,并且为您解答sql将多行数据合并为一行的相关问题,此外,我们还将为您提供关于SQL 2005合并/将多行合并为一列、SQL Server 将一列多行数据合并为一行、SQL SERVER 将多行数据合并成一行(转)、SQL Server中将多行的内容显示在一列中的知识。

本文目录一览:

在SQL Server中动态将多行合并为多列(sql将多行数据合并为一行)

在SQL Server中动态将多行合并为多列(sql将多行数据合并为一行)

我有一个很大的数据库表,需要在上面使用Microsoft SQL Server动态执行以下操作。

从这样的结果:

 badge   |   name   |   Job   |   KDA   |   Match  - - - - - - - - - - - - - - - - T996    |  Darrien |   AP    |   3.0   |   20 T996    |  Darrien |   ADC   |   2.8   |   16 T996    |  Darrien |   TOP   |   5.0   |   120

使用SQL的结果如下:

badge   |   name   |  AP_KDA | AP_Match | ADC_KDA | ADC_Match | TOP_KDA | TOP_Match - - - - - - - - -T996    |  Darrien |   3.0   |   20     |  2.8    |   16      |   5.0   |  120

即使有30行,它也将合并为具有60列的单行。

我目前可以通过硬编码(请参见下面的示例)来做到这一点,但是不能动态地做到。

Select badge,name,( SELECT max(KDA) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''AP'')) AP_KDA,( SELECT max(Match) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''AP'')) AP_Match,( SELECT max(KDA) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''ADC'')) ADC_KDA,( SELECT max(Match) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''ADC'')) ADC_Match,( SELECT max(KDA) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''TOP'')) TOP_KDA,( SELECT max(Match) FROM table WHERE (h.badge = badge) AND (h.name = name)  AND (Job = ''TOP'')) TOP_Matchfrom table h

我需要一个MSSQL语句,该语句允许我将多行合并为一行。第3列的Job内容将与第4列和第5列的标头(KDAMatch)合并,成为新的列。

所以,如果有6倍不同的值Job(比如Job1通过Job6),那么结果将有12列,如:Job1_KDAJob1_MatchJob2_KDAJob2_Match,等,由徽章和名称分组。

我需要一个可以遍历第3列数据的语句,因此不需要硬编码(针对每个可能的Job值重复查询)或使用临时表。

答案1

小编典典

我会使用动态SQL来做到这一点,但这是(http://sqlfiddle.com/#!6/a63a6/1/0)PIVOT解决方案:

SELECT badge, name, [AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match] FROM(SELECT badge, name, col, val FROM( SELECT *, Job+''_KDA'' as Col, KDA as Val FROM @T  UNION SELECT *, Job+''_Match'' as Col,Match as Val  FROM @T) t) ttPIVOT ( max(val) for Col in ([AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match]) ) AS pvt

奖励:这种如何将PIVOT与动态SQL(http://sqlfiddle.com/#!6/a63a6/7/0)结合使用的方法,我还是希望在没有PIVOT的情况下更简单地进行,但这对于我

SELECT badge, name, cast(Job+''_KDA'' as nvarchar(128)) as Col, KDA as Val INTO #Temp1 FROM Temp INSERT INTO #Temp1 SELECT badge, name, Job+''_Match'' as Col, Match as Val FROM TempDECLARE @columns nvarchar(max)SELECT @columns = COALESCE(@columns + '', '', '''') + Col FROM #Temp1 GROUP BY ColDECLARE @sql nvarchar(max) = ''SELECT badge, name, ''+@columns+'' FROM #Temp1 PIVOT ( max(val) for Col in (''+@columns+'') ) AS pvt''exec (@sql)DROP TABLE #Temp1

SQL 2005合并/将多行合并为一列

SQL 2005合并/将多行合并为一列

我们有些SQL杂语。说我有一个看起来像这样的结果…

61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | B
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | E
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | F

有没有一种方法可以将这些结果在SQL中分组以返回为

61E77D90-D53D-4E2E-A09E-9D6F012EB59C | ABCD
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | 英孚

有什么想法的人吗?

非常感谢

戴夫

SQL Server 将一列多行数据合并为一行

SQL Server 将一列多行数据合并为一行

SELECT  DISTINCT [列名]

      ,STUFF(

                        (

                              SELECT '',''+[列名]

                              FROM [表名]

                              WHERE [根据哪一列合并的列名]= A.列名

                              FOR XML PATH('''')

                        )

                        ,1,1,''''

                  )AS 合并的别名

  FROM [表名] AS 表的别名(A)

SQL SERVER 将多行数据合并成一行(转)

SQL SERVER 将多行数据合并成一行(转)

1)比如表中有三列数据:

  

2)执行如下查询:

复制代码
1 SELECT [USER_NAME], [USER_ACCOUNT]
2     , [ROLE_NAME] = stuff((
3         SELECT '','' + [ROLE_NAME]
4         FROM [WAP_WORKSHEET].[dbo].[userTest]
5         WHERE [USER_ACCOUNT] = a.[USER_ACCOUNT]
6         FOR XML path('''')
7     ), 1, 1, '''')
8 FROM [WAP_WORKSHEET].[dbo].[userTest] a
9 GROUP BY [USER_NAME], [USER_ACCOUNT]
复制代码

3)显示如下结果:

STUFF 函数:

a. 作用

stuff(param1, startIndex, length, param2)
将 param1 中自 startIndex (SQL 中都是从 1 开始,而非 0) 起,删除 length 个字符,然后用 param2 替换删掉的字符。

b. 参数

param1
一个字符数据表达式。param1 可以是常量、变量,也可以是字符列或二进制数据列。
startIndex
一个整数值,指定删除和插入的开始位置。如果 startIndex 或 length 为负,则返回空字符串。如果 startIndex 比 param1 长,则返回空字符串。startIndex 可以是 bigint 类型。
length
一个整数,指定要删除的字符数。如果 length 比 param1 长,则最多删除到 param1 中的最后一个字符。length 可以是 bigint 类型。

c. 返回类型

如果 param1 是受支持的字符数据类型,则返回字符数据。如果 param1 是一个受支持的 binary 数据类型,则返回二进制数据。

d. 备注

如果结果值大于返回类型支持的最大值,则产生错误。

FOR XML PATH  将查询结果集以 XML 形式展现,查询示例:

SELECT ''['' + [USER_NAME] + '','' + [ROLE_NAME] + '']''
FROM [WAP_WORKSHEET].[dbo].[userTest]
WHERE [USER_NAME] = ''蔡诗德''
FOR XML path('''');

结果如图:

4)实际应用:

SELECT USER_ACCOUNT AS '' 用户账户 '', USER_NAME AS '' 用户名 '', ORGANIZATION_NAME AS '' 组织''
, '' 角色 '' = REPLACE (REPLACE (REPLACE (STUFF ((
SELECT '','' + ROLE_NAME
FROM [dbo].[wapUserAndRole_20190612_b]
WHERE USER_ACCOUNT = a.USER_ACCOUNT
FOR XML path('''')
), 1, 1, ''''), '' 个人中心管理员,'', ''''), '', 个人中心管理员 '', ''''), '' 个人中心管理员 '', '''')
FROM [dbo].[wapUserAndRole_20190612_b] a
GROUP BY USER_ACCOUNT, USER_NAME, ORGANIZATION_NAME
ORDER BY ORGANIZATION_NAME;

外业人员信息查询

复制代码
1 SELECT USER_ACCOUNT AS ''用户账户'', USER_NAME AS ''用户名'', ORGANIZATION_NAME AS ''组织''
 2     , ''角色'' = REPLACE(REPLACE(REPLACE(STUFF((
 3         SELECT '','' + ROLE_NAME
 4         FROM [dbo].[wapUserAndRole_20190612_b]
 5         WHERE USER_ACCOUNT = a.USER_ACCOUNT
 6         FOR XML path('''')
 7     ), 1, 1, ''''), ''个人中心管理员,'', ''''), '',个人中心管理员'', ''''), ''个人中心管理员'', '''')
 8 FROM [dbo].[wapUserAndRole_20190612_b] a
 9 GROUP BY USER_ACCOUNT, USER_NAME, ORGANIZATION_NAME
10 ORDER BY ORGANIZATION_NAME;
复制代码

 原文引自:https://www.cnblogs.com/hendrix/p/11012772.html

SQL Server中将多行的内容显示在一列中

SQL Server中将多行的内容显示在一列中

SQL SERVER 2005支持XML格式数据,这个方法就是利用XML来进行转换。

SQL SERVER 2005支持XML格式数据,这个方法就是利用XML来进行转换。

STUFF(REPLACE(REPLACE((SELECT COL1 FROM [TABLE] N FOR XML AUTO ), '''', ''''), 1, 1, '''')

在查询语句后加FOR XML AUTO可以得到查询结果的xml类型格式为:

通过replace函数替换掉xml中结果以外的数据。

通过stuff函数将第一个节点替换的,去掉。

linux

今天关于在SQL Server中动态将多行合并为多列sql将多行数据合并为一行的讲解已经结束,谢谢您的阅读,如果想了解更多关于SQL 2005合并/将多行合并为一列、SQL Server 将一列多行数据合并为一行、SQL SERVER 将多行数据合并成一行(转)、SQL Server中将多行的内容显示在一列中的相关知识,请在本站搜索。

本文标签: