2017-06-11 3 views
0

Abfrage zurück StudentId und HaveGift, jetzt möchte ich, wenn (StudentId) zurückgegeben ich benutze eine andere Auswahl, um Student Info von tbl_Students (StuName, StuLName, ...) zu finden. Die SQL, die HaveGift Keine Rückkehr:Wählen Sie andere Daten in 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

Sie erwarten HaveGift = YES? Was ist die Frage genau? – user7294900

+0

Ich möchte Studenteninformationen von tbl_student basierend auf studentId auswählen, die zurückgegeben werden. –

Antwort

1

Wenn ich verstanden, was Sie richtig brauchen.

Verwendung Join für das Erhalten Schüler Informationen aus tbl_student auf StudentID basiert, die als nächste zurückgegeben: -

Statt: -

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] 

Typ:

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

Wenn ein schauen Sie Ihren Code , addieren Sie in prev und in cur die Punktzahl von tbl_ActPoint Tabelle, aber Sie wollen vergleichen tbl_EvaPoint diff.

ich mich erklären:

Sie A + B (erste Vereinigung) und A + C (zweite Vereinigung) zu vergleichen, können Sie vergleichen B und C.

Ich habe Ihre Abfrage wie folgt geändert:

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 

Wenn Sie die aktuelle Punktzahl zu wollen, können Sie es tun:

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