このテーブルを変更するにはどうすればよいですか
Name subject Mark
Aswin physics 100
Aswin chemistry 300
Aswin maths 200
の中へ
Aswin Physics 100 Chemistry 300 Maths 200
誰でも私を助けてください。
このテーブルを変更するにはどうすればよいですか
Name subject Mark
Aswin physics 100
Aswin chemistry 300
Aswin maths 200
の中へ
Aswin Physics 100 Chemistry 300 Maths 200
誰でも私を助けてください。
select Name,
sum(CASE
when [subject]='physics' then Mark
end) as Physics,
sum(CASE
when [subject]='chemistry' then Mark
end) as chemistry,
sum(CASE
when [subject]='maths' then Mark
end) as maths
from t group by Name
または、1行で必要な場合:
SELECT
t1.name,
MemberList = substring((SELECT ( ', ' + subject+' - '+
cast(Mark as varchar(100)) )
FROM t t2
WHERE t1.name = t2.name
ORDER BY
name,
subject
FOR XML PATH( '' )
), 3, 1000 )FROM t t1
GROUP BY name
SQL Pivoting を使用する必要があります。SQL SERVER – PIVOT and UNPIVOT Table Examplesの例を確認してください。SQLピボットを使用すると、行を列に変更でき、アンピボットは列から行への変換用です。
注:正確なスクリプトを提供できるかどうかを確認していますが、今のところリンクが役に立ちます。
コード例
実際のデータでこれをテストしていませんが、問題なく解析されます。
-- Pivot Table ordered by Name of Student
SELECT Name, Physics, Chemistry, Maths
FROM (
SELECT Name, Subject, Mark
FROM Student) up
PIVOT (SUM(Mark) FOR Student IN (Physics, Chemistry, Maths)) AS pvt
ORDER BY Name
-- Result should be something like
----------------------------------
Name Physics Chemistry Maths
----------------------------------
Aswin 100 300 200
----------------------------------
ピボットを作成するには、列に変換する実際の行の値を知る必要があります。動的なピボットについては、以前にここに書いたことがあります。
このデータを別々の列にするか、1 つの列にするかは明確ではありません。
これを別の列に表示したい場合はPIVOT
、SQL Server 2005 で利用可能になった関数を適用できます。
変換する値がすべてわかっている場合、または数が限られている場合は、クエリをハードコーディングできます。
select *
from
(
select name, subject +' '+ cast(mark as varchar(9)) as sub_mark,
'Subject_'+cast(row_number() over(partition by name
order by subject) as varchar(10)) col_name
from subjects
) s
pivot
(
max(sub_mark)
for col_name in (Subject_1, Subject_2, Subject_3)
) piv;
SQL Fiddle with Demoを参照してください。私がこれを他のピボット回答とは少し異なっていることに気付くでしょう。Subject_1
などの列名で件名/マークの両方を同じ列に配置しました。
値の数が不明な場合は、動的 SQL を使用できます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Subject_'+cast(row_number() over(partition by name
order by subject) as varchar(10)))
from subjects
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name,' + @cols + ' from
(
select name, subject +'' ''+ cast(mark as varchar(9)) as sub_mark,
''Subject_''+cast(row_number() over(partition by name
order by subject) as varchar(10)) col_name
from subjects
) x
pivot
(
max(sub_mark)
for col_name in (' + @cols + ')
) p '
execute(@query)
SQL Fiddle with Demoを参照してください。動的 SQL バージョンは、name
サブジェクトが 3 つを超える場合、列の数が増えます。
両方のクエリの結果は次のとおりです。
| NAME | SUBJECT_1 | SUBJECT_2 | SUBJECT_3 |
---------------------------------------------------
| Aswin | chemistry 300 | maths 200 | physics 100 |