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.rhkb.cn/news/458753.html

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

相关文章

Video-XL:面向小时级视频理解的超长视觉语言模型

在人工智能领域,视频理解一直是一个挑战性的任务,尤其是对于长时间视频内容的理解。现在,Video-XL的问世标志着我们在这一领域迈出了重要的一步。Video-XL是一个专为小时级视频理解设计的超长视觉语言模型,它能够处理超长视频序列…

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破(burpsuite) 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…

【Javaee】网络原理—http协议(一)

前言 本篇文章将详细介绍http协议,将介绍http抓包工具的下载与使用。 目录 一.http协议初识 1.概念 2.特点 1)版本 2)工作方式 二.http抓包工具 1.抓包是什么 2.抓包软件下载(Fiddler) 3.使用 三.http格式 …

04C++循环结构

//while 循环#include <iostream> using namespace std; int main() { int num0; while (num<10){ cout<<num<<endl; num; } return 0; } //do while语句 #include <iostream> using namespace std; int mai…

Appium中的api(一)

目录 1.基础python代码准备 1--参数的一些说明 2--python内所要编写的代码 解释 2.如何获取包名和界面名 1-api 2-完整代码 代码解释 3.如何关闭驱动连接 4.安装卸载app 1--卸载 2--安装 5.判断app是否安装 6.将应用放到后台在切换为前台的时间 7.UIAutomatorViewer的使用 1--找…

并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A

1.1 并联输出电路设计注意事项 直接对两个功率运算放大器的输出进行硬接线并不是一种好的电气做法。如果两个运算放大器的输出直接连接在一起&#xff0c;则可能会导致不均匀的电流共享。这是因为其中的每个运算放大器都尝试强制施加略微不同的 Vout 电压&#xff0c;该电压取决…

vulnhub(16):sickos(两种打点方式)

端口 ip&#xff1a;192.168.72.154 nmap -Pn -p- 192.168.72.154 --min-rate 10000PORT STATE SERVICE 22 open ssh 3128 open http-proxy 8080 closed http-proxy web渗透方式一&#xff1a;web后台 正常访问80端口&#xff0c;是不开放的&#xff0c;我们需要配置…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

云原生Istio基础

一&#xff0e;Service Mesh 架构 Service Mesh&#xff08;服务网格&#xff09;是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来&#xff0c;放到一个独立的层中进行管理。传统的微服务架构中&#x…

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

【十六进制数转十进制数 】

【十六进制数转十进制数 】 C语言版本C 版本Java版本Python版本 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 从键盘接收一个十六进制数&#xff0c;编程实现将其转换成十进制数。 输入 输入一个十六进制数 输出 输出一个十进制数 样…

GitHub 上的优质 Linux 开源项目,真滴硬核!

作为一名互联网人&#xff0c;提起 Linux 大家都不陌生&#xff0c;尤其是日常跟 Linux 操作系统打交道最多的&#xff0c;最熟悉不过了。互联网上关于 Linux 相关的教程和资料也非常的多&#xff0c;但是当你从中筛选出真正对自己有帮助的资料是需要花费很大精力与时间的。 G…

JVM基础(内存结构)

文章目录 内存结构JAVA堆方法区 &#xff08;Method Area&#xff09;运行时常量池&#xff08;Runtime Constant Pool&#xff09; 虚拟机栈 &#xff08;Java Virtual Machine Stack&#xff09;本地方法摘栈&#xff08;Native Method Stacks&#xff09;程序计数器&#xf…

交易的人生就是对未来不断的挑战!

在这个充满不确定性的市场中&#xff0c;我们每个人都渴望找到一条通往成功的路径。在Eagle Trader交易员中&#xff0c;有一位资深交易者&#xff0c;他不仅对交易有着不同寻常的执着和热爱&#xff0c;而且他的真诚见解和独到的交易哲学&#xff0c;可能会触动你的心弦。他的…

尚硅谷-react教程-求和案例-@redux-devtools/extension 开发者工具使用-笔记

## 7.求和案例_react-redux开发者工具的使用(1).npm install redux-devtools/extension(2).store中进行配置import { composeWithDevTools } from redux-devtools/extension;export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk))) src/redux/s…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

一行代码,实现请假审批流程(Java版)

首先画一个流程图 测试流程图 activiti 项目基础配置 activiti 工作流引擎数据库设计 工作流引擎API 介绍 什么是BPMN流程图 工作流引擎同类对比 继续学习方向 总结 工作流审批功能是办公OA系统核心能力&#xff0c;如果让你设计一个工作流审批系统&#xff0c;你会吗…

SDK5(note中)

在原有SDK5(note上)里的代码上添加了 timer的消息 LRESULT OnCreate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[11syy]WM_CREATE\n"));//创建一个计时器SetTimer(hwnd, 1, 1000, nullptr);return TRUE; }LRESULT OnClese(HWND …

全星魅 北斗三号船载终端的优势和领域利用

QM43BS型北斗三号船载终端&#xff1a;开启航海通信与定位新时代 在当今这个信息化高速发展的时代&#xff0c;航海领域对于通信与定位技术的需求愈发迫切。深圳市全民北斗科技有限公司&#xff0c;作为北斗技术应用领域的佼佼者&#xff0c;针对数传通信和位置服务应用&#x…

Python 实现深度学习模型预测控制--预测模型构建

链接&#xff1a;深度学习模型预测控制 链接&#xff1a;WangXiaoMingo/TensorDL-MPC: DL-MPC(deep learning model predictive control) is a software toolkit developed based on the Python and TensorFlow frameworks, designed to enhance the performance of tradition…