2017-10-30 14 views
0

テーブルに、高、中、低の3つの値を持つ列があります。列の値を列に変換する

テーブルのレコードごとに3つのチェックボックス(高、中、低)を表示し、優先度に基づいてチェックボックスをオンにします。

私は私が考えたアプローチがある次の出力

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

を返すSQLクエリ書きたいと思い

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

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

もっと簡単で効率的な解決法についてアドバイスをしてください。

+0

非常に長くなっています。 – ashish2199

+1

何を試しましたか?ここでcase文を使用してみてください – Simon

+0

@ ashish2199正しいことですが、3つのオプションしかないようですね。それでは、優先度= '高'、次に優先度else null end''の場合は中程度の場合、小文字の場合は... – Simon

答えて

0

CASEステートメントまたはcomputed columnsを使用できます。

+0

これに計算カラムを使用する方法は? – ashish2199

1

あなたはこのような何かを行うことができます。

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

あなたは私を示したコードが動作します。あなたはどんな問題を抱えていますか?

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の例です。

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  |  | 
+----+------+--------+-----+ 

またはAS IIF()を使用して:私はcase文を使用して、それを実行しようとしましたが、私はそれが私が持っているオプションの数とquerryに依存していることを実現

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

他の列を含める方法はありますか(ここでは、優先度1だけをピボットに含めました)?異なる値のセットを持つ別の列があるとします。 – ashish2199

関連する問題