SQL запрос вычисляет процент true из 10 логических столбцов - PullRequest
0 голосов
/ 21 марта 2020

У меня есть таблица «Оценки» с 10 логическими столбцами, которые называются PassA, PassB, Pass C, PassD и др. c. Я пытаюсь сделать запрос, который даст мне процент «true» в каждом столбце?

ID   PassA  PassB   PassC
1      x      x       
2             x       x
3      x
4             x

Ожидаемый результат запроса (или эквивалентный):

PassA  PassB   PassC
50%    75%     25%

Это Access SQL оператор.

Кажется, я могу сделать это с одним столбцом (см. Ниже), но не хочу делать это будет все столбцы в 1 запрос. Все идеи очень приветствуются? Спасибо!

SELECT PassA, (count(PassA(*)*100 / (Select count(*)FROM Grades} AS Total
FROM Grades
Group by PassA; 

Ответы [ 4 ]

1 голос
/ 21 марта 2020

С условным агрегированием:

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. Результаты:

PercentA    PercentB    PercentC
50%         75%         25%
0 голосов
/ 22 марта 2020

Поскольку это Access SQL:

SELECT 
    Avg(Abs([PassA])) AS AvgA, 
    Avg(Abs([PassB])) AS AvgB, 
    Avg(Abs([PassC])) AS AvgC
FROM 
    Grades;

Затем установите для свойства Формат полей значение Процент и количество десятичных знаков * От 1009 * до 0 :

enter image description here

0 голосов
/ 21 марта 2020

Для 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 не требуются.

0 голосов
/ 21 марта 2020

Для SQL Сервер (скрипка) :

DECLARE @t TABLE (passa BIT, passb BIT, passc BIT)
INSERT INTO @t VALUES (1,1,1), (1,0,0), (1,1,0)

SELECT 100 * SUM(CAST(passa AS NUMERIC(1,0))) / COUNT(*) [% A],
100 * SUM(CAST(passb AS NUMERIC(1,0))) / COUNT(*) [% B],
100 * SUM(CAST(passc AS NUMERIC(1,0))) / COUNT(*) [% C]
FROM @t

Для MySQL (скрипка) :

SELECT 100 * SUM(CAST(passa AS DECIMAL(1,0))) / COUNT(*) AS "% A",
100 * SUM(CAST(passb AS DECIMAL(1,0))) / COUNT(*) AS "% B",
100 * SUM(CAST(passc AS DECIMAL(1,0))) / COUNT(*) AS "% C"
FROM t

Оба запроса возвращают:

% A     % B         % C
100     66.6666     33.3333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...