SQL-将单元格/行输出附加到现有列名
我不确定这是否确实可行,但我正在寻找一种方法,从一行(一行表)中获取一个值,并将其附加到MS SQL Server中另一列的名称中 例如: 表A:SQL-将单元格/行输出附加到现有列名,sql,sql-server,Sql,Sql Server,我不确定这是否确实可行,但我正在寻找一种方法,从一行(一行表)中获取一个值,并将其附加到MS SQL Server中另一列的名称中 例如: 表A: [Document Count], [File Size] ------------------------- 50, 100 GB 结果: [Document Count (100 GB)] ------------------------ 50 如您所见,我正在将行值添加到另一列的标题名称中 我有几个专栏我想用一种自动化的
[Document Count], [File Size]
-------------------------
50, 100 GB
结果:
[Document Count (100 GB)]
------------------------
50
如您所见,我正在将行值添加到另一列的标题名称中
我有几个专栏我想用一种自动化的方式来做这件事,所以我尽量避免每次都要把它打印出来
我感谢你的帮助
DECLARE @t1 nvarchar(255), @cname nvarchar(255), @sqlcom nvarchar(2000), @s nvarchar(255)
select @cname = c.name from sys.columns c where c.object_id = object_id('table_A','U') and c.name like '%document_count%';
select @t1 = [filesize] from table_A;
set @s = '['+@cname+'_'+@t1+']';
set @sqlcom = 'select document_count as '+@s+' from table_A;'
exec (@sqlcom);
正如您所提到的,表中有多个列,在这种情况下,您可以使用此过程从所有其他列(所需的-“document_count”除外)中提取值并连接到第一个列名。检查以下各项:
create table table_A
(
document_count int,
filesize varchar(50)
);
GO
insert table_A values(50,'100 GB');
GO
CREATE PROCEDURE dbo.colnamegen (
/*
DECLARE @outparam NVARCHAR(255)
EXEC dbo.colnamegen 'table_A','%document_count%',@ColumnValues = @outparam OUTPUT;
*/
@tablename NVARCHAR(255),
@columnname NVARCHAR(255),
@ColumnValues NVARCHAR(255) OUTPUT)
AS
BEGIN
DECLARE
@colname NVARCHAR(25),
@AllColList NVARCHAR(255),
@tmpstr NVARCHAR(255),
@SqlCommand NVARCHAR(2500),
@collist NVARCHAR(1000),
@dynsql NVARCHAR(2500)
-- extracting column name '%document_count%'
SELECT @colname = c.name FROM sys.columns c WHERE c.object_id = OBJECT_ID(@tablename,'U') AND name like @columnname;
--A temperory string for removing the first column from all column list.
SET @tmpstr = ' + ISNULL( '+QUOTENAME(@colname)+' ,'' '') + ';
-- column list
SELECT @collist = SUBSTRING((select ', '+QUOTENAME(c.name)
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('table_A')--(@tablename)
FOR XML PATH('')),3, 1000);
-- A list of all columns in the table excluding the first column
-- which will used in dynamic query to perform concatenation of all the values of all
-- columns of table.
SELECT @AllColList = REPLACE((select ' + ISNULL( ' + QUOTENAME(c.name) + ' ,'' '')'
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(@tablename)
FOR XML PATH('')),@tmpstr,'');
--values from all the columns are concatenatied and assigned to a variable
SET @SqlCommand = '
SELECT @ColumnValues = a.newcol
FROM(
SELECT '+@AllColList+' AS newcol FROM '+@tablename+
')a;'
EXEC sp_executesql @SqlCommand, N'@ColumnValues nvarchar(255) OUTPUT', @ColumnValues = @ColumnValues OUTPUT;
--subsequent and final query for desired output
SET @dynsql = 'SELECT '+@collist+', '+@colname+' AS '+'['+@colname+@ColumnValues+']'+' FROM '+@tablename+';'
EXEC (@dynsql);
END;
GO
DECLARE @outparam NVARCHAR(255)
EXEC dbo.colnamegen 'table_A','%document_count%',@ColumnValues = @outparam OUTPUT;
GO
您可以尝试以下操作:
DECLARE @cols AS VARCHAR(MAX), @query AS VARCHAR(MAX);
SET @cols = STUFF((select distinct ',
MAX(CASE WHEN [Document Count]=''' + CAST([Document Count] as varchar(10)) + ''' THEN [Document Count] ELSE 0 END) AS [Document Count ' + CAST([File Size] as varchar(10)) +']'
/*---------------------------------you can add other columns similar to the above here----------------------------------*/
FROM #t
FOR XML PATH(''),type).value('.','varchar(max)'),1,2,'')
exec ('SELECT [Document Count], [File Size], ' + @Cols +' FROM #t group by [Document Count], [File Size]')
请找到DBFIDLE