10

私は次のような列を持つテーブルを持っています:

Sr.no  Subject  No of class attended    
-------------------------------------
1       English           3
2       Maths             4
3       SocialScience     5

この形式のテーブルが欲しい

English    Maths   SocialScience
---------------------------------
3            4          5

私はこれを試しました:

Select case when subject ='Maths' then COUNT(No_of_Candidates) else null  end as Maths

しかし、これで私は次のようなデータを取得します:

 English    Maths   SocialScience
---------------------------------
   3            
               4
                         5

これをどのように解決すればよいか教えてください..

4

5 に答える 5

7

あなたが言ったように、次のような出力は必要ありません。

 English    Maths   SocialScience
---------------------------------
   3            
               4
                         5

次のようにサブクエリを使用する必要があります。

SELECT English,Maths,SocialScience
FROM (
SELECT Subject,No_of_class_attended
  FROM mytable) up
PIVOT 
(Sum([No_of_class_attended]) 
 for Subject in ([English],[Maths],[SocialScience])) p

出力:

English    Maths   SocialScience
---------------------------------
3            4          5

  

このSQLFiddleを参照してください

詳細については、SQL SERVER – PIVOT および UNPIVOT テーブルの例を参照してください。

于 2012-08-29T11:21:44.083 に答える
3

ピボットの使用

SELECT *
FROM yourtable
PIVOT 
(Sum([No of class attended]) for Subject in ([English],[Maths],[SocialScience])) p
于 2012-08-29T10:50:59.227 に答える
2

podiluska ソリューションは正しいです。他のサブジェクトをテーブルに追加したいが、クエリを変更したくない場合は、動的ソリューションを共有したいと思います。ただし、長さに制限がありますが、特定の状況では確実に使用できます。

DECLARE @SQL nvarchar(MAX)
DECLARE @ColNames nvarchar(max)

SET @ColNames = ''

SELECT @ColNames = (CASE WHEN subjects.Subject IS NOT NULL THEN @ColNames + '[' + subjects.Subject + '],' ELSE '' END)
FROM subjects

SET @ColNames = LEFT(@ColNames, LEN(@ColNames) - 1)


EXEC('SELECT *
FROM subjects
PIVOT 
(Sum([classNum]) for Subject in (' + @ColNames + ')) p')

ここにSQL Fiddleがあります。

于 2012-08-29T11:20:27.513 に答える
1

PIVOT キーワードを使用したくない場合は、単純に MAX を使用できます。

Select MAX(case when subject ='Maths' then No_of_Candidates else null  end) as Maths
,MAX(case when subject ='English' then No_of_Candidates else null  end) as English
,MAX(case when subject ='SocialScience' then No_of_Candidates else null  end) as SocialScience
from tableName 

たとえば、テーブルに複数の学生の結果が含まれている場合は、GROUP BY を使用する必要があります。たとえば、次のようになります。

Select MAX(case when subject ='Maths' then No_of_Candidates else null  end) as Maths
,MAX(case when subject ='English' then No_of_Candidates else null  end) as English
,MAX(case when subject ='SocialScience' then No_of_Candidates else null  end) as SocialScience
from tableName Group By StudentID

どの値も NULL より大きいため、MAX は NULL を排除します

于 2012-08-29T17:48:08.867 に答える