对 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 服务器中从未这样做过,但以这种方式执行生成的查询会派上用场。