2017-06-11 22 views
0

クエリの戻り値StudentIdとHaveGiftは、(studentId)が返されたときに欲しいです。tbl_Students(StuName、StuLName、...)から学生情報を見つけるために別のselectを使用します。 HaveGiftノーリターンSQL:私はあなたが正しく必要なものを理解している場合SELECT CASE

CREATE PROCEDURE SelectGiftsTest 
    @StudentId    INT, 
    @DateMinCur  NVARCHAR(12), 
    @DateMaxCur  NVARCHAR(12), 
    @DateMinPrev NVARCHAR(12), 
    @DateMaxPrev NVARCHAR(12) 

AS 
    WITH Prev AS 
(
    SELECT StudentId, ISNULL(SUM(Score),0) As HighScoreUser 
FROM (SELECT StudentId, Score FROM tbl_ActPoint 
UNION ALL 
     SELECT StudentId, Score FROM tbl_EvaPoint  WHERE Date>[email protected] AND Date <= @DateMaxPrev AND StudentId = @StudentId 
    ) as T 
     GROUP BY StudentId 
), 
Cur AS 
(
    SELECT StudentId, ISNULL(SUM(Score),0) As HighScoreUser 
FROM (SELECT StudentId, Score FROM tbl_ActPoint 
UNION ALL 
     SELECT StudentId, Score FROM tbl_EvaPoint  WHERE Date>[email protected] AND Date <= @DateMaxCur  AND StudentId = @StudentId 
    ) as T 
     GROUP BY StudentId 
) 
SELECT CASE 
     WHEN(Prev.HighScoreUser <= Cur.HighScoreUser) 
     THEN 'Yes' 
     ELSE 'No' 
     END as HaveGift,Prev.StudentId 

FROM Prev 
INNER JOIN Cur 
ON Prev.StudentId = Cur.StudentId 
WHERE [email protected] 
RETURN 0 

image

+0

あなたはYES = HaveGiftを期待しますか?正確に何が問題なのですか? – user7294900

+0

返されたstudentIdに基づいて、tbl_studentから選択した生徒情報が必要です。 –

答えて

1

を。次の返さstudentIdに基づいてtbl_studentから学生の情報を取得するための

使用Join: -

の代わりに: -

SELECT CASE 
     WHEN(Prev.HighScoreUser <= Cur.HighScoreUser) 
     THEN 'Yes' 
     ELSE 'No' 
     END as HaveGift,Prev.StudentId 

FROM Prev 
INNER JOIN Cur 
ON Prev.StudentId = Cur.StudentId 
WHERE [email protected] 

タイプ:

SELECT CASE 
     WHEN(Prev.HighScoreUser <= Cur.HighScoreUser) 
     THEN 'Yes' 
     ELSE 'No' 
     END as HaveGift,Prev.StudentId 
     , std.name, std. .... -- put your columns here that refer to student info 

FROM Prev 
INNER JOIN Cur 
ON Prev.StudentId = Cur.StudentId 
INNER JOIN tbl_student std 
    on std.StudentId = Cur.StudentId 
WHERE [email protected] 
1

あなたのコードを見てtbl_ActPoint テーブルのスコアをprevとcurで合計しますが、tbl_EvaPoint diffと比較したいと思います。

私は私の説明:

あなたは+ B(第一組合)とA + C(第2組合)を比較、あなただけのBとC

を比較することができます私はこのようなクエリを変更しました:

with Total as (
    SELECT StudentId, 
    sum(case when Date between @DateMinPrev AND @DateMaxPrev then score else end) ScorePrev, 
    sum(case when Date between @DateMinCur AND @DateMaxCur then score else end) ScoreCur, 
    FROM tbl_ActPoint 
    where StudentId = @StudentId and (Date between @DateMinPrev AND @DateMaxPrev or Date between @DateMinCur AND @DateMaxCur) 
    group by StudentId 
) 
select 
CASE WHEN(ScorePrev <= ScoreCur) THEN 'Yes' ELSE 'No' END as HaveGift, tbl_student.* 
from tbl_student std left outer join total on std.StudentId = Total.StudentId 

あなたはあまりにも現在のスコアをしたい場合は、あなたがそれを行うことができます。

with Total as (
    SELECT StudentId, 
    sum(case when Date between @DateMinPrev AND @DateMaxPrev then score else end) ScorePrev, 
    sum(case when Date between @DateMinCur AND @DateMaxCur then score else end) ScoreCur, 
    FROM tbl_ActPoint 
    where StudentId = @StudentId and (Date between @DateMinPrev AND @DateMaxPrev or Date between @DateMinCur AND @DateMaxCur) 
    group by StudentId 
), 
CurrentScoreUser as (
    SELECT StudentId, sum(Score) CurrentScore FROM tbl_ActPoint group by StudentId 
) 

select 
CASE WHEN(ScorePrev <= ScoreCur) THEN 'Yes' ELSE 'No' END as HaveGift, CurrentScoreUser.CurrentScore, 
tbl_student.* 
from tbl_student std left outer join Total on std.StudentId = Total.StudentId 
left outer join CurrentScoreUser on CurrentScoreUser.StudentId=tbl_student.StudentId