将行的值转换为列

时间:2017-10-30 17:15:06

标签: sql sql-server

我在表格中有一列可以有3个值 - 高,中,低。

我想在网页上显示这些内容,其中包含表格中每条记录的3个复选框(高,中,低),并根据优先级勾选相应的复选框。

ID  Priority
-----------
1   High
2   Low
3   High
4   Medium

我想编写一个返回以下输出的SQL查询

ID  High  Medium  Low
---------------------
1    Y
2                  Y
3    Y
4           Y

我想到的方法是:

select 
    ID, 
    case 
       when priority = "High" then "Y" 
       else "N" 
    end as High,
    case 
       when priority = "Medium" then "Y" 
       else "N" 
    end as Medium,
    case 
       when priority = "Low" then "Y" 
       else "N" 
    end as Low;

这是我实际想要实现的玩具问题。

在我的真实项目中,我有5-6个这样的选项,每个列都不同,使用这种方法有4个这样的列使我的查询很长。

以下是一些列及其可能包含的各种值的示例

  • 业务增长 - 增长,稳定,下降,NA
  • 支票的频率 - 通常,有时,从不,NA

请提供更简单,更有效的解决方案。

4 个答案:

答案 0 :(得分:2)

您可以这样做:

SELECT id, 
       CASE WHEN priority = 'High' THEN 'Y' ELSE '' END AS High,
       CASE WHEN priority = 'Medium' THEN 'Y'  ELSE '' END AS Medium,
       CASE WHEN priority = 'Low' THEN 'Y'  ELSE '' END AS Low
FROM table

答案 1 :(得分:2)

DECLARE @T TABLE ( ID INT, Priority NVARCHAR(50) );

INSERT INTO @T ( ID,Priority) VALUES
(1,   N'High'),
(2,   N'Low'),
(3,   N'High'),
(4,   N'Medium');

SELECT ID, ISNULL(High, F) As High, ISNULL(Medium, F) As Medium, ISNULL(Low, F) As Low
FROM
    (
        SELECT  ID, Priority, 'Y' T , '' F
        FROM @T
     ) P1
     PIVOT
     ( 
         MAX(T) for Priority IN ([High], [Medium], [Low])
      )
      P2 ORDER BY ID;

结果:

+----+------+--------+-----+
| ID | High | Medium | Low |
+----+------+--------+-----+
|  1 | Y    |        |     |
|  2 |      |        | Y   |
|  3 | Y    |        |     |
|  4 |      | Y      |     |
+----+------+--------+-----+

或使用IIF()作为:

SELECT ID, 
       IIF(Priority = 'High', 'Y', '') AS High,
       IIF(Priority = 'Medium', 'Y', '') AS Medium,
       IIF(Priority = 'Low', 'Y', '') AS Low
FROM @T;

答案 2 :(得分:1)

你给我看的代码有效。你有什么问题?

select id
       ,case when priority = 'high' then 'y' else 'n' end as high
       ,case when priority = 'medium' then 'y' else 'n' end as medium
       ,case when priority = 'low' then 'y' else 'n' end as low
from mytable

以下是您可以使用here进行的rextester示例。

答案 3 :(得分:0)

您可以使用CASE声明或computed columns