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;

如果您想要一次性计算(以提高查询效率),请使用 CROSS JOIN。别担心,这个 CROSS JOIN 不会产生笛卡尔积,它只有一行。这可能比子查询方法更快:

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 回答