1

わかりました、私は 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 能力を超えています。

ありがとう!!!

4

2 に答える 2

1

複数ある場合にどの名前を選択するかをどのように決定するかによって異なります。考えられる方法の 1 つを以下に示します。

SELECT p.StudentEmail, p.DevUnits, MAX(s.StudentName)
FROM #PPEInfo p
RIGHT OUTER JOIN Surveys s
ON p.StudentEmail = s.StudentEmail
ORDER BY DevUnits DESC, StudentName ASC
GROUP BY p.studentEmail, p.devUnits

ここでは、メールと単位でグループ化し、「MAX」の学生名を取得しています。

また、最初のクエリでは、暗黙的な結合の使用を停止する必要があります。

于 2013-03-06T23:45:42.910 に答える
0

私が間違っている場合は私を訂正してください、しかし私はあなたがあなたが望むものを達成するためにこれをすることができるとかなり確信しています:

select * from enrollments
inner join coursekeys on 
enrollments.studentemail = coursekeys.studentemail 
where coursekeys.studentname=(
    select top 1 studentname from coursekeys 
    where studentemail=enrollments.studentemail
);

現在、SQL Serverにアクセスできませんが、同様のテーブルを使用するMySQLサーバーでこれを正常に実現しました。

于 2013-03-06T23:55:37.080 に答える