3

このテーブルを変更するにはどうすればよいですか

Name      subject     Mark
Aswin     physics     100
Aswin     chemistry   300
Aswin     maths       200

の中へ

Aswin Physics 100 Chemistry 300 Maths 200

誰でも私を助けてください。

4

4 に答える 4

2

PIVOT 演算子を使用して、SQL サーバーでこのジョブを実行できます。

これらのリンク link1 と link2 を確認するを列に変更する方法が示されます。

これがあなたに役立つことを願っています!

于 2013-02-15T07:02:25.980 に答える
2

SQLFiddle デモ

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行で必要な場合:

SQLFiddle デモ

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
于 2013-02-15T07:04:04.600 に答える
1

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

----------------------------------

ピボットを作成するには、列に変換する実際の行の値を知る必要があります。動的なピボットについては、以前にここに書いたことがあります。

于 2013-02-15T07:00:22.370 に答える
1

このデータを別々の列にするか、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 |
于 2013-02-15T11:06:27.807 に答える