SQL Server动态列转行

SQL Server 2017及以上版本

STRING_AGG

确实,STRING_AGG 是 SQL Server 2017 (版本 14.x) 及更高版本中引入的一个聚合函数,它允许你将多个行的值组合成一个字符串,并且你可以指定一个分隔符来分隔这些值。由于你正在使用 SQL Server 2014,STRING_AGG 函数在你的环境中是不可用的。

在 SQL Server 2014 中,要达到类似 STRING_AGG 的效果,你可以使用 FOR XML PATH 方法,这是 SQL Server 较早版本中常用的技巧来聚合字符串。下面是一个使用 FOR XML PATH 来模拟 STRING_AGG 功能的示例:

DECLARE @cols AS NVARCHAR(MAX);SELECT @cols = STUFF((SELECT ',' + QUOTENAME(FNUMBER)FROM (SELECT DISTINCT FNUMBERFROM YourTable -- 替换为你的实际表名) AS SubQueryFOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); -- 移除第一个逗号-- 现在 @cols 包含了用逗号分隔的、带引号的 FNUMBER 列表

在这个示例中,STUFF 函数用于移除由 FOR XML PATH 生成的字符串列表的第一个逗号。QUOTENAME 函数用于确保列名被正确地用方括号括起来,这在处理包含特殊字符或保留字的列名时特别有用。

一旦你有了这个列表,你就可以像之前的示例那样构建你的动态 PIVOT 查询。

示例

    DECLARE @cols AS NVARCHAR(MAX),  @query AS NVARCHAR(MAX);  -- 获取所有唯一的FNUMBER值,并构建用于PIVOT操作的列列表  SELECT @cols = STRING_AGG(QUOTENAME(FNUMBER), ',')   FROM (  SELECT DISTINCT r1.FNUMBER FROM t_sec_FuncPermission p1  INNER JOIN t_sec_funcPermissionEntry p2 ON p1.FItemID = p2.FItemID  INNER JOIN T_SEC_PERMISSIONITEM p3 ON p2.FPermissionItemID = p3.FItemID  INNER JOIN t_meta_objectType o1 ON p1.FObjectTypeID = o1.FID AND o1.fdevtype != 2  INNER JOIN t_sec_role r1 ON p1.FRoleID = r1.FRoleID  Where 1=1 ) AS RoleNumbers;  -- 构建动态PIVOT查询  SET @query = '  SELECT FObjectTypeID, FItemID, ' + @cols + '  FROM   (  SELECT   r1.FNUMBER,   p1.FObjectTypeID,    p3.FItemID,  CASE p2.FPERMISSIONSTATUS     WHEN ''0'' THEN ''有权''     WHEN ''2'' THEN ''禁止''     ELSE ''无权''     END AS FPermissionStatusName  FROM     t_sec_FuncPermission p1     INNER JOIN t_sec_funcPermissionEntry p2 ON p1.FItemID = p2.FItemID     INNER JOIN T_SEC_PERMISSIONITEM p3 ON p2.FPermissionItemID = p3.FItemID      INNER JOIN t_meta_objectType o1 ON p1.FObjectTypeID = o1.FID AND o1.fdevtype != 2    INNER JOIN t_sec_role r1 ON p1.FRoleID = r1.FRoleID  Where 1=1 ) x  PIVOT  (  MAX(FPermissionStatusName) FOR FNUMBER IN (' + @cols + ')  ) p ';  -- 执行动态查询  EXEC sp_executesql @query;  

SQL Server 2014以下版本

在 SQL Server 2014 中,STRING_AGG 函数是不可用的,因为这是一个在 SQL Server 2017(版本 14.x)及更高版本中引入的聚合函数。为了在 SQL Server 2014 中实现类似的功能,你可以使用 FOR XML PATH 方法来生成一个由逗号分隔的字符串列表。

以下是将你的查询修改为适用于 SQL Server 2014 的版本:

DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX);-- 获取所有唯一的FNUMBER值,并构建用于PIVOT操作的列列表
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(FNUMBER)FROM (SELECT DISTINCT r1.FNUMBERFROM t_sec_FuncPermission p1INNER JOIN t_sec_funcPermissionEntry p2 ON p1.FItemID = p2.FItemIDINNER JOIN T_SEC_PERMISSIONITEM p3 ON p2.FPermissionItemID = p3.FItemIDINNER JOIN t_meta_objectType o1 ON p1.FObjectTypeID = o1.FID AND o1.fdevtype != 2INNER JOIN t_sec_role r1 ON p1.FRoleID = r1.FRoleID-- Where 1=1 这个条件实际上没有作用,可以移除) AS RoleNumbersFOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); -- 使用STUFF函数移除最前面的逗号-- 构建动态PIVOT查询
SET @query = '
SELECT FObjectTypeID, FItemID, ' + @cols + '
FROM (SELECT r1.FNUMBER,p1.FObjectTypeID,p3.FItemID,CASE p2.FPERMISSIONSTATUSWHEN ''0'' THEN ''有权''WHEN ''2'' THEN ''禁止''ELSE ''无权''END AS FPermissionStatusNameFROM t_sec_FuncPermission p1INNER JOIN t_sec_funcPermissionEntry p2 ON p1.FItemID = p2.FItemIDINNER JOIN T_SEC_PERMISSIONITEM p3 ON p2.FPermissionItemID = p3.FItemIDINNER JOIN t_meta_objectType o1 ON p1.FObjectTypeID = o1.FID AND o1.fdevtype != 2INNER JOIN t_sec_role r1 ON p1.FRoleID = r1.FRoleID-- Where 1=1 这个条件实际上没有作用,可以移除
) x
PIVOT (MAX(FPermissionStatusName) FOR FNUMBER IN (' + @cols + ')
) p';-- 执行动态查询
EXEC sp_executesql @query;

在这个修改后的版本中,我使用了 FOR XML PATH 来生成一个 XML 字符串,然后通过 .value('.', 'NVARCHAR(MAX)') 方法将其转换为 NVARCHAR(MAX) 类型。接着,我使用 STUFF 函数来移除字符串最前面的逗号,从而得到一个由逗号分隔的列名列表。

请注意,我在查询中移除了 Where 1=1 条件,因为它实际上并不对查询结果产生任何影响。如果你需要添加特定的过滤条件,你应该在 INNER JOIN 子句之前或之后添加它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

岭回归的MATLAB步骤

MATLAB 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R、MAPE 进行评价,以及绘制相应的可视化图表。 1. 数据导入 首先,导入你的 Excel 文件 data.xlsx。假设前面的列是因变量(特征&a…

Java | ReentrantLock 锁和 synchronized 锁的区别和共同特点是什么?

ReentrantLock 和 synchronized 都是 Java 中的锁机制,主要用于实现线程间的互斥访问,确保线程安全。它们有一些共同点,也有各自的特性和区别。以下是二者的详细对比: 一、共同特点 可重入性:两者都是可重入锁&#x…

Redis 过期事件监听器

Redis 过期事件监听器完整实现 要使用 Redis 过期事件监听器来更新数据库状态,我们需要确保 Redis 的事件通知已启用,并实现监听器来捕获过期的键,并根据需要更新数据库。 步骤 1:启用 Redis 过期事件通知 需要在 Redis 配置文件…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if : 表达式返回真值时才被渲染 v-else :表达式返回为假时不被渲染 2、 分支条件判断 v-else-if :使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …

PortQry下载安装使用教程(超详细),Windows测试UDP端口

《网络安全自学教程》 PortQry是微软官方提供的一款TCP/IP连接「排障工具」,用来「检查」TCP/UDP「端口状态」。 平时检查端口状态,最常用的是telnet,但它是基于TCP协议的,无法检测「UDP端口」,这篇文章教大家如何在W…

Axure随机验证码高级交互

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:字母数字随机验证码高级交互 主要内容:4位字母数字随机验证码生成、错误提示与State状态同步 应用场景:登录验证码、其他类…

面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。 代码示例 import java.util.concurrent.Semaphore;public class SequentialPrinting123 {private static Se…

管家婆工贸ERP BB036.销售退货单生成销售单

最低适用版本: 工贸系列 22.0 插件简要功能说明: 销售退货单生成销售单,支持联查上下游,并反写已生单数量更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--销售退货单生成销售单 插件详细功能文档: 1. 单据字段占用: a. 销售单: ⅰ. 占用自由项11、12、…

leetcode:34. 在排序数组中查找元素的第一个和最后一个位置(python3解法)

#1024程序员节 | 征文# 难度:中等 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(lo…

Vue中的过渡与动画:提升用户体验的秘籍

Vue中的过渡与动画:提升用户体验的秘籍 在现代Web开发中,用户体验(UX)的重要性不言而喻。Vue.js作为一个渐进式JavaScript框架,提供了一套简单而强大的过渡和动画系统,使得开发者能够轻松地为应用添加平滑的过渡效果和动画。本文…

短信验证码发送实现(详细教程)

短信验证码 接口防刷强检验以及缓存验证码阿里云短信服务操作步骤验证码发送实现 好久没发文啦!最近也是在工作中遇到我自认为需要记录笔记的需求,本人只求日后回顾有迹可寻,不喜勿喷! 废话不多说,直接上代码&#xff…

初识算法 · 前缀和(1)

目录 前言: 一维数组的前缀和 题目解析 算法原理 算法编写 二维数组的前缀和 题目解析 算法原理 算法编写 前言: ​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。 链接…

504 Gateway Time-outopenresty

504 Gateway Time-out openresty 问题背景: 当自己点开知乎页面以后,发现官网没有出现任何问题,点击官网以后开始出现各种各样的报错! 一下是来源ai的介绍:(通过搜索这种形式帮助自己进行记忆)…

spring整体框架+IOC+Bean 学习笔记

1.spring包含了多个功能模块,其中最重要的是spring-core,主要提供ioc依赖注入功能的支持,spring中的其他模块功能都需要依赖该模块。 spring整体框架 最底层: 1.core:spring框架的核心工具类 2.bean:提供…

【WebGIS实例】(18)MapboxGL 绘制矢量——线、面

前言 Mapbox GL JS 版本:3.6.0 该博客仅供学习参考,如果您是计划在实际项目中实现该功能,也推荐您直接使用已有的功能库: 官方案例:Draw a polygon and calculate its areamapbox-gl-draw:mapbox/mapbox-g…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

HTTPS讲解

前瞻 HTTP与HTTPS的关系 HTTPS也是一个在应用层的协议,是在HTTP协议基础上的一个加密解密层 明文 密文 秘钥 明文->秘钥 加密 秘钥->明文 解密 例如:明文为7 秘钥为2 7^21015; 5就是密文例子: 因为http的内容是明文传输的,明文…

危险物品图像分割系统:一键训练

危险物品图像分割系统源码&数据集分享 [yolov8-seg-GFPN&yolov8-seg-CSwinTransformer等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global…

LabVIEW共享变量通信故障

问题概述: 在LabVIEW项目中,使用IO服务器创建共享变量,并通过LabVIEW作为从站进行数据通信。通讯在最初运行时正常,但在经过一段时间或几个小时后,VI前面板出现错误输出,导致数据传输失败。虽然“分布式系统…

折扣影票接口对接渠道如何选择?

选择折扣影票接口对接渠道需要综合多方面因素考虑,以下是一些建议: 1.合法性和合规性: 确认供应商资质:优先选择具有相关票务经营资质的渠道。比如一些大型的在线票务平台,它们通常经过官方认证和监管,在…