SQL如何将查找表中的动态行透视到列中



我有一个每隔一段时间维护一次的查找表,其中填充了要在报告中显示的驱动程序。表格如下:

驱动程序
部门
存储 Driver-1
存储 Driver-2
存储 Driver-3

让我们从处理以下语句开始:

我不想使用动态sql,我需要另一个工作的解决方案

如果您的驱动程序数量不确定,正如我在评论中提到的,您需要使用动态SQL。没有办法绕过这一点;不可能有非动态SQL导致动态列数,而这不是该语言的工作方式。

由于您还没有提到您使用的SQL Server的版本,我将假设您使用的是较新的版本,因此可以访问STRING_AGG。如果没有,则需要使用旧的FOR XML PATH方法。由于您没有定义行中的值应该是什么,我猜它应该是部门的名称

这给出了这样的东西:

CREATE TABLE dbo.YourTable (Department varchar(10),
Driver varchar(10));
GO
INSERT INTO dbo.YourTable
VALUES('Store','Driver-1'),
('Store','Driver-2'),
('Store','Driver-3');
GO
DECLARE @Dept varchar(10) = 'Store';
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
DECLARE @Delimiter nvarchar(30) = N',' + @CRLF + N'       ';
SELECT @SQL = N'SELECT ' + STRING_AGG(N'Department AS ' + QUOTENAME(Driver),@Delimiter) WITHIN GROUP (ORDER BY Driver ASC) + @CRLF +
N'FROM dbo.YourTable YT' + @CRLF +
N'WHERE Department = @Dept' + @CRLF +
N'GROUP BY Department;'
FROM dbo.YourTable YT
WHERE Department = @Dept;
--PRINT @SQL; --Your best friend
EXEC sys.sp_executesql @SQL, N'@Dept varchar(10)', @Dept;
GO
DROP TABLE dbo.YourTable;

db<gt;小提琴

最新更新