1

から2005を...オペランドのデータ型varchar型が和演算子には無効である - 私は、SQL Serverの使用していますプロシージャのエラー訂正

ALTER Proc [dbo].[ExamResult] (@Course_Id varchar(100), @Semester varchar(10)) 
as 
begin 
    declare @subjname varchar(100) 
    declare @subjects varchar(7000) 
    declare @subjectsselection varchar(7000) 
    declare @SumSelection varchar(7000) 
    declare @NoOfSubjects int 
    set @NoOfSubjects = 0 

    set @subjects = '' 
    set @subjectsselection = '' 
    set @SumSelection = '' 

    DECLARE subject_cursor CURSOR 
    FOR SELECT distinct Subject_Name FROM Exam_Result where course_id = @Course_Id And Semester = @Semester 

    OPEN subject_cursor 

    FETCH NEXT FROM subject_cursor 
    INTO @subjname 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @subjects = @subjects + '[' + @subjname + '],' 
     set @subjectsselection = @subjectsselection + 'Sum(Isnull([' + @subjname + '],0)) As [' + @subjname + '],' 
     set @SumSelection = @SumSelection + 'Sum(Isnull([' + @subjname + '],0))+' 

     set @NoOfSubjects = @NoOfSubjects + 1 

     FETCH NEXT FROM subject_cursor 
     INTO @subjname 
    End 
    CLOSE subject_cursor; 
    DEALLOCATE subject_cursor; 

    select @subjects = LEFT(@subjects, LEN(@subjects) - 1) 
    select @subjectsselection = LEFT(@subjectsselection, LEN(@subjectsselection) - 1) 
    select @SumSelection = LEFT(@SumSelection, LEN(@SumSelection) - 1) 

    print @subjects 
    print @subjectsselection 
    print @SumSelection 

    declare @query nvarchar(4000) 

    set @query = 'select S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, ' + @subjectsselection + ',' 
    set @query = @query + 'Exam_Type,' + @SumSelection + ' As Grand_Total, ' 
    set @query = @query + '(' + @SumSelection + ')' + '/' + convert(varchar(10),@NoOfSubjects) + ' As Avg' 
    set @query = @query + ' From ' 
    set @query = @query + '(select Enroll_Number, Student_Name, Course_Id, Semester, Subject_Name, MarksObtained, Exam_Type from Exam_Result) ps ' 
    set @query = @query + ' pivot(sum(MarksObtained) for Subject_Name in (' + @subjects + ')) as pvt' 
    set @query = @query + ' inner join Stud_Info S on S.Enroll_Number = pvt.Enroll_Number ' 
    set @query = @query + ' where pvt.Course_Id = ''' + @Course_Id + ''' and pvt.Semester = ''' + @Semester + '''' 
    set @query = @query + ' group by S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, Exam_Type' 
    print @query 
    exec sp_executesql @query 
end 

Exam_Resultテーブル

CREATE TABLE [dbo].[Exam_Result](
    [Result_Id] [int] IDENTITY(1,1) NOT NULL, 
    [Enroll_Number] [varchar](50) NULL, 
    [Student_Name] [varchar](100) NULL, 
    [Course_Id] [varchar](50) NULL, 
    [Semester] [varchar](50) NULL, 
    [Subject_Id] [varchar](50) NULL, 
    [Subject_Name] [varchar](50) NULL, 
    [MarksObtained] [Varchar](10) NULL, 
    [Exam_Type] [varchar](50) NULL) 

サンプルデータクエリ ...

INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','1','PS1','ps1','60','Final') 
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','70','Final') 
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','80','Final') 
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','20','Internal') 
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','22','Internal') 

Student_Infoテーブル:それは私にこのようなエラーが発生します

CREATE TABLE [dbo].[Stud_Info](
    [Enroll_Number] [varchar](20) NOT NULL, 
    [Student_Name] [varchar](20) NULL, 
    [Course_Type] [varchar](20) NULL, 
    [Course_Id] [varchar](20) NULL, 
    [Semester] [varchar](20) NULL, 
    [Password] [varchar](20) NULL, 
    [Gender] [varchar](6) NULL, 
    [City] [varchar](15) NULL, 
    [Mobile_Number] [varchar](10) NULL) 

私はちょうど... ... Enroll_Numberのような、検索Student_Informationに使用

メッセージ8117、レベル16、状態1

、行1
オペランドデータ型varcharは、合計演算子では無効です。

ラーフル:あなたは私はこのような更新に答えるが、それはまだエラーを与えるごとに......

set @query = @query + ' pivot(sum(cast(MarksObtained as int)) for Subject_Name in (' + @subjects + ')) as pvt' 

私はas varchar(10)(私はMarksObtained列を使用していますので、それがエラーを与えると思います)... plz varcharintに変換する方法を教えてください。合計でMarksObtainedの合計を行うことができます。

+2

カラムに整数値が含まれている場合、なぜそれをVARCHARとして宣言しましたか? – Oded

+0

最後にv何人かの生徒がその件名に欠けている場合はvarcharとしてマークするように命じました.ABSとして挿入する必要があります... dats私はそれを変換したいです – mack28

+1

その後**アプリケーションで**変換してください。データベースに格納しないでください。 – Oded

答えて

3

あなたは、この方法のように変換することができます:

SUM (CONVERT(int,<your varchar column>)) 

あなたのvarchar型の列には、実際に数値を保持している場合、これは動作します。

sum(cast(varchar_column as int)) 

EDIT:

ちょうど2列(名前とmarksobtained)、タイプvarchar(10)の両方でサンプルテーブルを作成し、にいくつかのデータを挿入しそうでなければ、あなたは次のようにcast機能を使用して、それをキャストしてみてくださいそれ。私はselect *

name   marksobtained 
Mr. Anil    30 
Mr. sunil   70 
Mr. patel   70 

のように見えるように170を返さ

select SUM(cast(marksobtained as int)) as 'totalmarksobtained' from sampletab 

のようなマークを合算。

@subjectsにはどのような値がありますか?いくつかのサンプルを投稿してください。

+0

rahul - あなたの即時返信のおかげで、両方ともまだ私のために働いていない...私は質問を更新しました..uそれを見ることができます – mack28

+1

マック、 'MarksObtained'列のいくつかのサンプルデータを共有してください。それを一度試して、あなたに知らせるでしょう。 – Rahul

+0

rahul - yaa確かに...あなたは上記のように私のサンプルデータを見ることができます....ありがとう – mack28

0

あなたのクエリ

例では "キャスト" を使用することができます。

select sum(cast(Enter_your_field_name as int)) from Table_name 

はそれがあなたのために働く願っています。

関連する問題