SQL查询从10个布尔列计算百分比true
我有一个名为“Grades”的表,其中有10个布尔列,分别称为PassA、PassB、PassC、PassD等。 我正在尝试进行一个查询,该查询将给出每列中“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语句 我似乎可以用一列(见下文)来完成,但如果不这样做,将在一个查
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%