1

私は、winforms と VB を使用してアンケート アプリカンを作成しています。これは、統計を表示するためにこれまでに取得した SQL です。

SELECT
    tblAlt.altText,
    Count(tblAnswers.answerID)
FROM tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;

これは、質問の各選択肢と、それらに回答した数を返します。同じ SQL クエリで合計何人が回答したかをカウントする方法はありますか?

関連するテーブルは次のとおりです。

_______________     _______________     ___________  _______________
|_tblUsers____|     |_tblAnswers___|    |_tblAlt__|  |_tblQuestion_|
| userID      |     | answerAltID  |    | altID   |  | questID     |
| username    |     | userID       |    | altText |  | questText   |
|_____________|     |______________|    |_questID_|  |_____________|

どんな助けでも大歓迎です!

これは私が最後に使用したものです:

SELECT
tblAlt.altText,
Count(tblAnswers.answerID),
(SELECT COUNT(answerID) FROM tblAnswers, tblAlt 
WHERE tblAnswers.answerAltID = tblAlt.altID 
AND tblAlt.questID = " & CInt(questionID) & ") as total_count
FROM tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;
4

2 に答える 2

2

ロールアップを使用:

SELECT
    tblAlt.altText,
    Count(tblAnswers.answerID)
FROM tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText WITH ROLLUP;

1 回限りの計算 (クエリを効率化するため) が必要な場合は、CROSS JOIN を使用します。心配しないでください。この CROSS JOIN はデカルト積を生成しません。1 行だけです。これは、サブクエリ アプローチよりも高速である可能性があります。

SELECT
tblAlt.altText,
Count(tblAnswers.answerID), x.total_count    
FROM tblAlt
cross join (SELECT COUNT(answerID) as total_count FROM tblAnswers) as x 

LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;

または、MySqlism を使用すると、より高速になる可能性があります。

SELECT
tblAlt.altText,
Count(tblAnswers.answerID), @total_count as total_count
FROM tblAlt
cross join (SELECT @total_count := COUNT(answerID) FROM tblAnswers) as x

LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;

または、複数ステートメントを使用できます。SETステートメントは、ADO.NET の DataReader または DataTable には表示されないことに注意してください。ADO.NET は、実際のクエリから引き続き結果を取得できます。これは、すべてのアプローチの中で確実に高速になります。

SET @total_count := (SELECT COUNT(answerID) FROM tblAnswers);
SELECT
tblAlt.altText,
Count(tblAnswers.answerID), @total_count as total_count
FROM tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;
于 2012-05-07T01:00:26.070 に答える
1

次のようなサブクエリを使用してこれを行うことができます。

SELECT
tblAlt.altText,
Count(tblAnswers.answerID),
(SELECT COUNT(answerID) FROM tblAnswers) as total_count
FROM tblAlt
LEFT JOIN tblAnswers ON (tblAlt.altId = tblAnswers.altID)
WHERE tblAlt.questionID = " & CInt(questionID) & "
GROUP BY tblAlt.altText;

いくつかのリソース:

http://beginner-sql-tutorial.com/sql-subquery.htm

http://www.1keydata.com/sql/sql-subquery.html

于 2012-05-07T00:49:50.467 に答える