web-dev-qa-db-ja.com

列名でアンピボット

Name, Maths, Science, Englishを持つテーブルStudentMarksがあります。データはこんな感じ

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

私はそれを次のように整理したいです。

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60

With npivot Name、Marksを正しく取得できますが、ソーステーブルの列名を目的の結果セットのSubject列に取得できません。

どうすればこれを達成できますか?

私はこれまでに次のクエリにたどり着きました(名前、マークを取得するため)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt
108
Tilak

あなたの質問は非常に近いです。最終的な選択リストにsubjectを含む次のものを使用できるはずです。

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

SQL Fiddleデモ付き を参照してください。

177
Taryn

次のコードで一連のロジックを使用して、標準のSQLアンピボット方法を試すこともできます。次のコードには、3つのステップがあります。

  1. クロスジョインを使用して各行に複数のコピーを作成します(この場合は件名列も作成します)。
  2. "mark"列を作成し、case式を使用して適切な値を入力します(例:主語が科学であれば科学の列から値を選びます)。
  3. nULLの組み合わせを削除します(存在する場合、基本表にNULL値が厳密にない場合は表式を完全に回避できます)。

     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;
    
7
Rahul Kohli

SELECT * FROM学生

UNPIVOT(Marks for subject in(Maths、Science、English));

0
Tutu Kumari