对 SQL 服务器中的列列表执行相同的 case 语句
Perform same case statement on list of columns in SQL Server
我有一个看起来像这样的 table:
Name … Column A1 A2 B1 B2 C1 …
Name1 … value1 5 3 1 5 2 …
Name2 … value2 4 4 2 3 4 …
Name3 … value3 3 5 5 5 1 …
左边有一些存储字符串的列。右边有一堆存储 1-5 值的列。
我需要编写一个 returns:
的查询
Name A1 A2 B1 B2 C1 …
Name1 100 50 0 100 25 …
Name2 75 75 25 50 75 …
Name3 50 100 100 100 0 …
我需要 select 名称列,然后是右侧的所有列。我需要将 1-5 个值转换为代表分数的 0-100 个值(5 个映射到 100,4 个映射到 75,等等)。
如果只有少数 "score" 列,我可以使用 case 语句轻松完成此操作。例如,当 A1 是唯一的分数列时:
SELECT Name
,CASE when A1 = 5 then 100
when A1 = 4 then 75
when A1 = 3 then 50
when A1 = 2 then 25
when A1 = 1 then 0
else null
END as score
但是如果我有一百个分数列,那么这样做是不切实际的。
我希望能够传入 'A1,A2,B1,B2,C1,...'
的字符串,并让我的查询对字符串中的每个列名执行上述 case 语句。有什么办法吗?或者有更好的方法吗?
我研究了 while 循环、函数、存储过程和动态 SQL,但我从未使用过任何这些,也没有找到任何可以直接应用的内容。
就用SELECT Name, 25*(A1-1) AS A1, 25*(A2-1) AS A2 ...
我想。
关于您的第二个问题,您可以通过 运行:
生成大部分查询
SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + '''' AS 'SELECT Name'
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME <> 'Name'
itsLex 解决方案将是我的首选 (+1),但如果您需要生成非线性分数,另一个选择是 CHOOSE()
Select Name
,[Column]
,A1 = choose(A1,0,25,50,75,100)
,A2 = choose(A2,0,25,50,75,100)
,B1 = choose(B1,0,25,50,75,100)
,B2 = choose(B2,0,25,50,75,100)
,C1 = choose(C1,0,25,50,75,100)
From YourTable
Returns
Name Column A1 A2 B1 B2 C1
Name1 value1 100 50 0 100 25
Name2 value2 75 75 25 50 75
Name3 value3 50 100 100 100 0
假设您希望自动生成和执行语句:
DECLARE @SQLString NVARCHAR(MAX);
SET @SQLString = (SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + ''''
FROM yourDatanase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME <> 'Name'
FOR XML PATH (''));
DECLARE @SQLString2 NVARCHAR(MAX);
SET @SQLString2 = 'SELECT Name' + @SQLString + ' FROM yourTable';
EXEC (@SQLString2)
假设您坚持要有一个要查看的列的限制列表:
DECLARE @SQLString NVARCHAR(MAX);
SET @SQLString = (SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + ''''
FROM yourDatanase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME IN ('A1', 'A2', 'B1', 'B2')
FOR XML PATH (''));
DECLARE @SQLString2 NVARCHAR(MAX);
SET @SQLString2 = 'SELECT Name' + @SQLString + ' FROM yourTable';
EXEC (@SQLString2)
以前在 SQL 服务器中从未这样做过,但以这种方式执行生成的查询会派上用场。
我有一个看起来像这样的 table:
Name … Column A1 A2 B1 B2 C1 …
Name1 … value1 5 3 1 5 2 …
Name2 … value2 4 4 2 3 4 …
Name3 … value3 3 5 5 5 1 …
左边有一些存储字符串的列。右边有一堆存储 1-5 值的列。
我需要编写一个 returns:
的查询Name A1 A2 B1 B2 C1 …
Name1 100 50 0 100 25 …
Name2 75 75 25 50 75 …
Name3 50 100 100 100 0 …
我需要 select 名称列,然后是右侧的所有列。我需要将 1-5 个值转换为代表分数的 0-100 个值(5 个映射到 100,4 个映射到 75,等等)。
如果只有少数 "score" 列,我可以使用 case 语句轻松完成此操作。例如,当 A1 是唯一的分数列时:
SELECT Name
,CASE when A1 = 5 then 100
when A1 = 4 then 75
when A1 = 3 then 50
when A1 = 2 then 25
when A1 = 1 then 0
else null
END as score
但是如果我有一百个分数列,那么这样做是不切实际的。
我希望能够传入 'A1,A2,B1,B2,C1,...'
的字符串,并让我的查询对字符串中的每个列名执行上述 case 语句。有什么办法吗?或者有更好的方法吗?
我研究了 while 循环、函数、存储过程和动态 SQL,但我从未使用过任何这些,也没有找到任何可以直接应用的内容。
就用SELECT Name, 25*(A1-1) AS A1, 25*(A2-1) AS A2 ...
我想。
关于您的第二个问题,您可以通过 运行:
生成大部分查询SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + '''' AS 'SELECT Name'
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME <> 'Name'
itsLex 解决方案将是我的首选 (+1),但如果您需要生成非线性分数,另一个选择是 CHOOSE()
Select Name
,[Column]
,A1 = choose(A1,0,25,50,75,100)
,A2 = choose(A2,0,25,50,75,100)
,B1 = choose(B1,0,25,50,75,100)
,B2 = choose(B2,0,25,50,75,100)
,C1 = choose(C1,0,25,50,75,100)
From YourTable
Returns
Name Column A1 A2 B1 B2 C1
Name1 value1 100 50 0 100 25
Name2 value2 75 75 25 50 75
Name3 value3 50 100 100 100 0
假设您希望自动生成和执行语句:
DECLARE @SQLString NVARCHAR(MAX);
SET @SQLString = (SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + ''''
FROM yourDatanase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME <> 'Name'
FOR XML PATH (''));
DECLARE @SQLString2 NVARCHAR(MAX);
SET @SQLString2 = 'SELECT Name' + @SQLString + ' FROM yourTable';
EXEC (@SQLString2)
假设您坚持要有一个要查看的列的限制列表:
DECLARE @SQLString NVARCHAR(MAX);
SET @SQLString = (SELECT ', 25*(' + COLUMN_NAME + '-1) AS ''' + COLUMN_NAME + ''''
FROM yourDatanase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTable'
AND COLUMN_NAME IN ('A1', 'A2', 'B1', 'B2')
FOR XML PATH (''));
DECLARE @SQLString2 NVARCHAR(MAX);
SET @SQLString2 = 'SELECT Name' + @SQLString + ' FROM yourTable';
EXEC (@SQLString2)
以前在 SQL 服务器中从未这样做过,但以这种方式执行生成的查询会派上用场。