-1

次のデータベース設計があります。

Employee Table: Username, Name.....
Divisions Table: SapCode, DivisionShortcut, DivisionName 
Quiz Table: QuizID, Title, IsSent, Description
UserQuiz Table: UserQuizID, QuizID, DateTimeComplete, Score, Username 

(IsSent は、全従業員に送信されたクイズを参照するフラグです)

送信されたクイズのタイトルと各部門の合計参加者数を取得する次のクエリがあります。クエリは正常に機能しますが、小さなエラーがあります。検索結果は最後に送信したクイズから表示されます。クイズのタイトルは、クイズ 12、クイズ 11、クイズ 10 のようになっています。これで、(クイズ 9) が最後のクイズであることがわかります。ただし、最後に送信されたクイズは (クイズ 12) です。

では、このクエリを修正して正しい結果を得るにはどうすればよいでしょうか?

クエリ:

SELECT     TOP (100) PERCENT COUNT(DISTINCT dbo.UserQuiz.Username) AS [Total Number of Participants], dbo.Divisions.DivisionShortcut, dbo.Quiz.Title
FROM         dbo.employee INNER JOIN
                      dbo.UserQuiz ON dbo.employee.Username = dbo.UserQuiz.Username INNER JOIN
                      dbo.Quiz ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID INNER JOIN
                      dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode
WHERE     (dbo.Quiz.IsSent = 1)
GROUP BY dbo.Divisions.DivisionShortcut, dbo.Quiz.Title
ORDER BY dbo.Quiz.Title DESC
4

2 に答える 2

1

タイトルで注文しており、タイトルは varchar です。"1" と "11" が "9" の前にあるため、アルファベット順に並べると "Quiz 11" が "Quiz 9" の前になります。

さて、QuizID 値をどのように入力するかはわかりませんが、自動入力された整数である場合は、使用する方が良いかもしれません

ORDER BY dbo.Quiz.QuizID DESC

代わりは。

いっそのこと、Quiz テーブルに CreatedDate を追加し、代わりにその列で並べ替えます。

于 2012-07-02T05:03:08.240 に答える
0

最後に、何百万回も試行した結果、答えが得られました。解決策は非常に簡単です。

SELECT     TOP (100) PERCENT COUNT(DISTINCT dbo.UserQuiz.Username) AS [Total Number of Participants], dbo.Divisions.DivisionShortcut, dbo.Quiz.Title
FROM         dbo.employee INNER JOIN
                      dbo.UserQuiz ON dbo.employee.Username = dbo.UserQuiz.Username INNER JOIN
                      dbo.Quiz ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID INNER JOIN
                      dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode
WHERE     (dbo.Quiz.IsSent = 1)
GROUP BY dbo.Divisions.DivisionShortcut, dbo.Quiz.Title, dbo.UserQuiz.QuizID
ORDER BY dbo.UserQuiz.QuizID DESC
于 2012-07-02T05:04:05.307 に答える