わかりました、私は SQL に精通している必要がありますが、結合、ユニオンなどがどのように機能するかについてはよく知っていますが、これに対する解決策を思いつくことはできません。2 つの異なるテーブルからデータを取得しようとしていますが、モンキー レンチは、結果セットに実際に必要な数よりも多くの行が右側のテーブルにある可能性があることです。2 つのテーブルを結合する唯一の条件は、電子メール アドレスです。コードは次のとおりです。
CREATE TABLE #PPEInfo(StudentEmail nvarchar(128), StudentName nvarchar(128), DevUnits int)
INSERT INTO #PPEInfo (StudentEmail, DevUnits)
SELECT e.StudentEmail AS Email, sum(ck.DevelopmentUnits) AS DevUnits
FROM Enrollments e, CourseKeys ck
WHERE e.CertGenerated = 'true'
AND e.CourseId = ck.CourseId
GROUP BY e.StudentEmail
ORDER BY DevUnits DESC
SELECT p.StudentEmail, p.DevUnits, s.StudentName
FROM #PPEInfo p
RIGHT OUTER JOIN Surveys s
ON p.StudentEmail = s.StudentEmail
ORDER BY DevUnits DESC, StudentName ASC
DROP TABLE #PPEInfo
問題は、提出時に同じ名前を使用していない可能性があるため、複数の学生名を受け取ることです。例えば:
Email Address James R. Salvati
Email Address James Salvati
私が思いついた唯一の解決策は、最初に一時テーブルに電子メール アドレスを入力し、次に "TOP(1)" を使用して名前の調査テーブルをクエリして、学生の名前を 1 つだけ取得することです。それは機能しますが、CPU を非常に集中的に使用し、多くのレコードを扱っています。コードは次のとおりです (ただし、この時点では DevUnits については気にしませんでしたが、何かを考え出そうとしただけです)。
CREATE TABLE #PPEInfo(ID int IDENTITY(1,1), StudentEmail nvarchar(128), StudentName nvarchar(128), DevUnits int)
INSERT INTO #PPEInfo (StudentEmail)
SELECT DISTINCT StudentEmail FROM Enrollments
WHERE CertGenerated = 'true'
DECLARE @rowID int
DECLARE @email nvarchar(128)
SET @rowID = (SELECT max(ID) FROM #PPEInfo)
WHILE (@rowID > 0)
BEGIN
SET @email = (SELECT StudentEmail FROM #PPEInfo WHERE ID = @rowID)
UPDATE #PPEInfo
SET StudentName = (SELECT TOP(1) s.StudentName FROM Surveys s
WHERE s.StudentEmail = @email)
WHERE ID = @rowID
SET @rowID = @rowID - 1
END
SELECT * FROM #PPEInfo
ORDER BY DevUnits DESC
DROP TABLE #PPEInfo
これらのボードのいずれかに実際に投稿する必要はありませんでした。私は通常、解決策を見つけるか、解決策を見つけますが、これは私の SQL 能力を超えています。
ありがとう!!!