SQL查询从10个布尔列计算百分比true

SQL查询从10个布尔列计算百分比true,sql,ms-access,Sql,Ms Access,我有一个名为“Grades”的表,其中有10个布尔列,分别称为PassA、PassB、PassC、PassD等。 我正在尝试进行一个查询,该查询将给出每列中“true”的百分比 ID PassA PassB PassC 1 x x 2 x x 3 x 4 x 预期查询结果(或等效结果): 这是一个Access SQL语句 我似乎可以用一列(见下文)来完成,但如果不这样做,将在一个查

我有一个名为“Grades”的表,其中有10个布尔列,分别称为PassA、PassB、PassC、PassD等。 我正在尝试进行一个查询,该查询将给出每列中“true”的百分比

ID   PassA  PassB   PassC
1      x      x       
2             x       x
3      x
4             x
预期查询结果(或等效结果):

这是一个Access SQL语句

我似乎可以用一列(见下文)来完成,但如果不这样做,将在一个查询中删除所有列。所有的想法都很受欢迎?谢谢大家!

SELECT PassA, (count(PassA(*)*100 / (Select count(*)FROM Grades} AS Total
FROM Grades
Group by PassA; 
对于SQL Server:

对于MySQL:

两个查询都返回:

% A     % B         % C
100     66.6666     33.3333

对于Oracle,我将执行以下操作:

WITH TOT_COUNT AS (SELECT 1 "ID", COUNT(*) "Total" FROM Grades)
SELECT "ID",
       COUNT(DECODE(GMLDA, '8', 'X', Null))/"Total" "ScoreA",
       COUNT(DECODE(GMR001, 'D15', 'X', Null))/"Total" "ScoreB",
       COUNT(DECODE(GMR002, 'B', 'X', Null))/"Total" "ScoreC"
FROM (SELECT 1 "ID", T1.* FROM Grades T1) JOIN TOT_COUNT USING("ID")
GROUP BY "ID", "Total";
它基本上是使“False”值无效,这样它们就不会被计数。当然,你可以反过来做


优点:不需要DDL权限。

使用条件聚合:

SELECT
  ROUND(100.0 * AVG(IIF(PassA, 1, 0)), 2) & '%' AS PercentA,
  ROUND(100.0 * AVG(IIF(PassB, 1, 0)), 2) & '%' AS PercentB,
  ROUND(100.0 * AVG(IIF(PassC, 1, 0)), 2) & '%' AS PercentC
FROM Grades
对于MS Access,这也适用:

SELECT
  ROUND(100.0 * AVG(-PassA), 2) & '%' AS PercentA,
  ROUND(100.0 * AVG(-PassB), 2) & '%' AS PercentB,
  ROUND(100.0 * AVG(-PassC), 2) & '%' AS PercentC
FROM Grades
因为
TRUE
存储为
-1
FALSE
存储为
0

结果:

由于这是Access SQL:

选择
Avg(Abs([PassA])作为AvgA,
平均值(Abs([PassB])作为平均值,
Avg(Abs([PassC])作为AvgC
从…起
分数;
然后将字段的Format属性设置为Percent,小数计数设置为0


表有列,而不是字段。我认为有10行有一个布尔,而不是1行,有10个布尔值。提问并标记您正在使用的DBMS。还将表和示例数据的
createtable
语句添加为
INSERT-INTO
语句。用样本数据显示预期结果。感谢您的反馈-我为糟糕的措辞道歉。我现在编辑了这个问题,希望能更简洁。即使Gustav的答案有效,您的数据模型也很糟糕,正如jarlh所注意到的!了解数据库规范化!工作完美-非常感谢!你帮我省去了很多头痛:-)
WITH TOT_COUNT AS (SELECT 1 "ID", COUNT(*) "Total" FROM Grades)
SELECT "ID",
       COUNT(DECODE(GMLDA, '8', 'X', Null))/"Total" "ScoreA",
       COUNT(DECODE(GMR001, 'D15', 'X', Null))/"Total" "ScoreB",
       COUNT(DECODE(GMR002, 'B', 'X', Null))/"Total" "ScoreC"
FROM (SELECT 1 "ID", T1.* FROM Grades T1) JOIN TOT_COUNT USING("ID")
GROUP BY "ID", "Total";
SELECT
  ROUND(100.0 * AVG(IIF(PassA, 1, 0)), 2) & '%' AS PercentA,
  ROUND(100.0 * AVG(IIF(PassB, 1, 0)), 2) & '%' AS PercentB,
  ROUND(100.0 * AVG(IIF(PassC, 1, 0)), 2) & '%' AS PercentC
FROM Grades
SELECT
  ROUND(100.0 * AVG(-PassA), 2) & '%' AS PercentA,
  ROUND(100.0 * AVG(-PassB), 2) & '%' AS PercentB,
  ROUND(100.0 * AVG(-PassC), 2) & '%' AS PercentC
FROM Grades
PercentA    PercentB    PercentC
50%         75%         25%