Microsoft SQL中实现多行用户参数数据转单行多列
SQL多行转单行多列(自定义表头)解决方案(Microsoft SQL)
针对你的需求,这里提供两种在Microsoft SQL中实现多行转单行多列、自定义表头的可行方法:
方法一:使用PIVOT函数
PIVOT是SQL Server专门用于行转列的内置函数,适合已知需要转换的列名的场景:
SELECT CLASS AS 用户账号, [VOICE#] AS 语音编号, [LAST_ACCESS] AS 最后访问时间, [LOGIN_STAT] AS 登录状态, [PASSWORD] AS 密码, [PIN] AS PIN码, [S_LOGIN_ACCESS] AS 安全登录权限, [VM_LAST_LOGIN] AS 语音邮箱最后登录时间, [VM_PIN_UPDATE] AS 语音邮箱PIN更新时间, [WEB_FIRST_LOGIN] AS 网页首次登录时间 FROM ( -- 子查询过滤出目标数据 SELECT [CLASS], [KEYNAME], [KEY] FROM [DBO].[UserRecords] WHERE [KEYNAME] IN ('VOICE#', 'LAST_ACCESS', 'LOGIN_STAT', 'PASSWORD', 'PIN', 'S_LOGIN_ACCESS', 'VM_LAST_LOGIN', 'VM_PIN_UPDATE', 'WEB_FIRST_LOGIN') AND [CLASS] = 'TESTUSERACCOUNT' ) AS SourceTable PIVOT ( -- 聚合函数取对应KEY值(因单用户单参数仅一行,MAX适用) MAX([KEY]) -- 指定要转成列的字段 FOR [KEYNAME] IN ([VOICE#], [LAST_ACCESS], [LOGIN_STAT], [PASSWORD], [PIN], [S_LOGIN_ACCESS], [VM_LAST_LOGIN], [VM_PIN_UPDATE], [WEB_FIRST_LOGIN]) ) AS PivotTable;
方法二:使用CASE WHEN + 聚合函数
如果对PIVOT不熟悉,也可以用CASE结合聚合函数实现,兼容性更强:
SELECT CLASS AS 用户账号, MAX(CASE WHEN KEYNAME = 'VOICE#' THEN [KEY] END) AS 语音编号, MAX(CASE WHEN KEYNAME = 'LAST_ACCESS' THEN [KEY] END) AS 最后访问时间, MAX(CASE WHEN KEYNAME = 'LOGIN_STAT' THEN [KEY] END) AS 登录状态, MAX(CASE WHEN KEYNAME = 'PASSWORD' THEN [KEY] END) AS 密码, MAX(CASE WHEN KEYNAME = 'PIN' THEN [KEY] END) AS PIN码, MAX(CASE WHEN KEYNAME = 'S_LOGIN_ACCESS' THEN [KEY] END) AS 安全登录权限, MAX(CASE WHEN KEYNAME = 'VM_LAST_LOGIN' THEN [KEY] END) AS 语音邮箱最后登录时间, MAX(CASE WHEN KEYNAME = 'VM_PIN_UPDATE' THEN [KEY] END) AS 语音邮箱PIN更新时间, MAX(CASE WHEN KEYNAME = 'WEB_FIRST_LOGIN' THEN [KEY] END) AS 网页首次登录时间 FROM [DBO].[UserRecords] WHERE [KEYNAME] IN ('VOICE#', 'LAST_ACCESS', 'LOGIN_STAT', 'PASSWORD', 'PIN', 'S_LOGIN_ACCESS', 'VM_LAST_LOGIN', 'VM_PIN_UPDATE', 'WEB_FIRST_LOGIN') AND [CLASS] = 'TESTUSERACCOUNT' GROUP BY CLASS;
说明
- 两种方法都通过
AS关键字自定义了表头,你可以根据实际需求修改别名(比如把“语音编号”改成业务需要的名称)。 - 聚合函数
MAX的作用是排除CASE WHEN返回的NULL值,仅保留对应参数的有效值(因单用户单参数仅一行数据,不会有冲突)。
内容的提问来源于stack exchange,提问作者herba
相关产品推荐
相关产品推荐

