Создание таблицы с использованием Group By - PullRequest
0 голосов
/ 15 января 2019

Я использую Microsoft Access 2016.

У меня есть такая таблица:

Column_1   Status
    a       Fail
    b       Pass
    a       Not tested
    c       Fail
    c       Pass

Я хочу создать запрос, который получит меня:

Column_1   Fail Not tested  Pass 
    a        1       1       0   
    b        0       0       1    
    c        1       0       1    

Я хочу иметь возможность подсчитать, сколько раз появляется Status для уникального типа Column_1. Для меня это похоже на случай GROUP BY, но у меня возникают проблемы с получением правильных подсчетов за статус.

Вот одна попытка:

SELECT [c1],
COUNT(IIF (Status='Pass', 1, 0) ) As Pass,
COUNT(IIF (Status='Fail', 1, 0) ) As Fail,
COUNT(IIF (Status='Not tested', 1, 0) ) As [Not tested]
FROM table_1
GROUP BY  [c1]

Это, однако, дает мне одинаковое количество во всех 3 столбцах. И подсчеты тоже не верны. Я думал о включении Status в мое предложение GROUP BY, но это только увеличивает количество строк или записей в моем результате, повторяя a и / или b для статуса, что не то, что я хочу. Что я тут не так делаю?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Поскольку вы используете Access, у вас должна быть возможность создать запрос CrossTab для получения желаемых результатов:

TRANSFORM Count(tblTest.Status) AS CountOfStatus
SELECT tblTest.Column_1
FROM tblTest
GROUP BY tblTest.Column_1
PIVOT tblTest.Status;

В качестве альтернативы вы можете сделать кросс-таблицу вручную, изменив агрегатные функции с счетного на сумму или изменив последний параметр вашей функции iif на null, или оба:

SELECT tblTest.Column_1,
Sum(IIf([Status]='Fail',1,0)) AS Fail,
Count(IIf([Status]='Not Tested',1,Null)) AS [Not tested],
Sum(IIf([Status]='Pass',1,Null)) AS Pass
FROM tblTest
GROUP BY tblTest.Column_1;
0 голосов
/ 17 января 2019

поэтому, прежде чем идти по пути кросс-таблицы - учтите, что 1 и 0, которые вы отображаете в исходном сообщении, не существуют в базе данных.Ваш предпочтительный макет действительно является кросс-таблицей, но это не нормализованная структура данных, которую используют базы данных - вот почему вы можете пересмотреть свой подход.

Если вы используете агрегированный запрос, вы можете группировать и считать;при сохранении нормализованной структуры данных.Управлять разработчиком гораздо проще.В этом случае вы должны иметь: ID Status Count a Fail 1 a Не проверено 1 b Pass 1 c Fail 1 c Pass 1 [извините, не сохраняйте столбчатое отображение, как в окне сообщения]

Вы можете сделать немногоонлайн-репетитор о совокупном запросе.Это не будет считать 0 для несуществующих записей.Но если вы проявите гибкость в этой презентации, она будет намного проще.

0 голосов
/ 15 января 2019

Я бы сделал два запроса - сначала запрос с использованием функций итогов для группировки и подсчета каждого нужного столбца.

SELECT tblTest.Column_1, tblTest.Status, Count(tblTest.Status) AS CountOfStatus
FROM tblTest
GROUP BY tblTest.Column_1, tblTest.Status;

Затем запрос, который считывает первый запрос и форматирует ваши данные так, как вы хотите..

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