powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
25 сообщений из 97, страница 2 из 4
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164451
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучкаAinur.smнепоймучка,

и как сделать? может кроме SRC создать новый запрос? Отдельно для причин ?так, стоп. я, видать, недопонял

то есть, Реализация и Отказ - это отдельная песня (в поле DealStage) - и с ней мы разобрались,
но КРОМЕ того, у вас есть ЕЩЕ одно поле (RefuseReasons), где пишутся причины отказа, так?

1) какого типа это поле?

2) показанная вами картинка со списком причин - еэто вы просто так, или у вас есть ОТДЕЛЬНАЯ таблица со списокм причин (типа справочник причин)

3) вы пишете "кроме Реализация и Отказа мне надо добавить" - добавить в ЭТОТ же запрос?
в какое место, в каком порядке?

можете как-то образец желаемого итогового результата показать для примера?


Да все верно.
1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой.
2. Надо посчитать кол-во каждой причин. Например Кол-во записей со значением поле(DealStage) равным "Отказ" и со значением поле ПРичины отказа (RefuseReasons) равным "Не устроило время ответа". И Процент – как отношение количества отказных заявок по причине «Не устроило время ответа» к общему количеству отказных заявок. Кол-во "Не устроило время ответа"/ кол-во отказ *100
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164454
Ainur.sm,

если все так, то да - можно и так.
т.е. создаете еще один запрос (например REF) по аналогии с SRC - только для поля RefuseReasons

причем, чтобы меньше потом менять в итоговом запросе, лучше сделать там этому полю выходной алиас
с тем же именем, что и в запросе SRC (DealStage) вот в таком духе:
Код: vbnet
1.
SELECT RefuseReasons AS DealStage,...

потом попробуйте (для начала) сделать ЕЩЕ один запрос,
скопируйте в него целиком текст запроса 'Итоговый'
замените там SRC на REF и посмотрите на результат (только суммы, проценты позже)
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164459
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучка,

Создала REF для RefuseReasons.


SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals
WHERE Year(DateClosed)=2015;

а Куда это писать.

SELECT RefuseReasons AS DealStage,...
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164460
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ainur.smнепоймучка,

Создала REF для RefuseReasons.


SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals
WHERE Year(DateClosed)=2015;

а Куда это писать.

SELECT RefuseReasons AS DealStage,...




и как изменить IIF(qdfDeals.DealStage='Реализация*',2,3) AS ord, для RefuseReasons??
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164465
Ainur.smAinur.smпропущено...

кол-во причины "Неустроило время ответа" разделить на кол-во "ОТКАЗ" * 100%это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе
посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа
Код: vbnet
1.
...(SELECT M,Count(1) AS N FROM SRC GROUP BY M)...


и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100

А для случая запроса с причинами вам надо в Итоговом запросе
в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида
Код: vbnet
1.
SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M


и кстати, в ЭТОМ под-select'е надо выбирать именно FROM SRC (а не FROM REF), ибо отказы у вас - в SRC
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164472
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучка,
не так быстро......
создала REF


SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Count(*) AS ord
FROM qdfDeals
WHERE Year(DateClosed)=2015
GROUP BY Format(DateClosed,"mmmm"), RefuseReasons;
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164475
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучкаAinur.smпропущено...


кол-во причины "Неустроило время ответа" разделить на кол-во "ОТКАЗ" * 100%это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе
посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа
Код: vbnet
1.
...(SELECT M,Count(1) AS N FROM SRC GROUP BY M)...


и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100

А для случая запроса с причинами вам надо в Итоговом запросе
в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида
Код: vbnet
1.
SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M


и кстати, в ЭТОМ под-select'е надо выбирать именно FROM SRC (а не FROM REF), ибо отказы у вас - в SRC


Добавить так?

SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC GROUP BY M) (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164476
Ainur.smAinur.smнепоймучка,

Создала REF для RefuseReasons.


SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals
WHERE Year(DateClosed)=2015;

а Куда это писать.

SELECT RefuseReasons AS DealStage,...

вот так
Код: vbnet
1.
2.
SELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals



а вот тут:
Ainur.sm1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой.
а что это за "галочки"? (начинаю подозревать плохое)

уточните - вот у вас есть текстовое поле RefuseReasons
в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи?
путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи?
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164481
Ainur.smнепоймучкапропущено...
это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе
посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа
Код: vbnet
1.
...(SELECT M,Count(1) AS N FROM SRC GROUP BY M)...


и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100

А для случая запроса с причинами вам надо в Итоговом запросе
в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида
Код: vbnet
1.
SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M


и кстати, в ЭТОМ под-select'е надо выбирать именно FROM SRC (а не FROM REF), ибо отказы у вас - в SRC


Добавить так?

SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC GROUP BY M) (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
Добавить - в смысле просто where добавить к тому, что было и все
Код: vbnet
1.
2.
3.
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164482
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучкаAinur.smпропущено...


вот так
Код: vbnet
1.
2.
SELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals



а вот тут:
Ainur.sm1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой.
а что это за "галочки"? (начинаю подозревать плохое)

уточните - вот у вас есть текстовое поле RefuseReasons
в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи?
путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи?


Галочка для выбора из перечисленных причин.
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164484
Ainur.smнепоймучкапропущено...

вот так
Код: vbnet
1.
2.
SELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y
FROM qdfDeals



а вот тут:
пропущено...

а что это за "галочки"? (начинаю подозревать плохое)

уточните - вот у вас есть текстовое поле RefuseReasons
в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи?
путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи?


Галочка для выбора из перечисленных причин.это я понимаю

суть вопроса такова:
для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой)
1) только одну причину или
2) неколько причин - столько сколько оператор поставт галочек?
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164487
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучкаAinur.smпропущено...



Добавить так?

SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC GROUP BY M) (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
Добавить - в смысле просто where добавить к тому, что было и все
Код: vbnet
1.
2.
3.
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord







Вот что получилось

Итоговый запрос



TRANSFORM MIN(N)
SELECT ord, DealStage
FROM [SELECT DealStage,M,ord,Count(1) AS N FROM SRC GROUP BY M,DealStage,ord

UNION ALL


SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord

UNION ALL

SELECT DealStage,'ИТОГО',ord,Count(1) FROM SRC GROUP BY DealStage,ord

UNION ALL

SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC T,(SELECT Count(1) AS N FROM SRC) S
GROUP BY T.DealStage,T.ord

UNION ALL

SELECT 'Поступившие заявки',M,1,Count(1) FROM SRC GROUP BY M

UNION ALL

SELECT 'Поступившие заявки',M & '%',1,100 FROM SRC GROUP BY M

UNION ALL

SELECT 'Поступившие заявки','ИТОГО',1,Count(1) FROM SRC

UNION ALL

SELECT 'Поступившие заявки','ИТОГО%', 1, 100 FROM SRC
]. AS X
GROUP BY ord, DealStage
ORDER BY ord
PIVOT M IN (
'Январь','Январь%',
'Февраль','Февраль%',
'Март','Март%',
'Апрель','Апрель%',
'Май','Май%',
'Июнь','Июнь%',
'Июль','Июль%',
'Август','Август%',
'Сентябрь','Сентябрь%',
'Октябрь','Октябрь%',
'Ноябрь','Ноябрь%',
'Декабрь','Декабрь%',
'ИТОГО','ИТОГО%'
);


REF
SELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, Count(*) AS ord
FROM qdfDeals
WHERE Year(DateClosed)=2015
GROUP BY Format(DateClosed,"mmmm"), RefuseReasons;
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164492
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучкаAinur.smпропущено...



Галочка для выбора из перечисленных причин.это я понимаю

суть вопроса такова:
для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой)
1) только одну причину или
2) неколько причин - столько сколько оператор поставт галочек?

Программа позволяет выбрать несколько причин.
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164493
Ainur.smнепоймучкапропущено...

Добавить - в смысле просто where добавить к тому, что было и все
Код: vbnet
1.
2.
3.
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord







Вот что получилось

Итоговый запрос...

в этом Итоговом надо заменить SRC на REF - везде кроме под-select'ов
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164494
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непоймучкаа что это за "галочки"? (начинаю подозревать плохое)
Подозрения наверняка оправдаются. Скорее всего галочки многозначное поле и надо проверять Value многозначного поля на соответствие условиям.
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164495
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_world,


TRANSFORM MIN(N)
SELECT ord, DealStage
FROM [SELECT DealStage,M,ord,Count(1) AS N FROM SRC GROUP BY M,DealStage,ord

UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord

UNION ALL

SELECT DealStage,'ИТОГО',ord,Count(1) FROM REF GROUP BY DealStage,ord

UNION ALL

SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF T,(SELECT Count(1) AS N FROM SRC) S
GROUP BY T.DealStage,T.ord

UNION ALL

SELECT 'Поступившие заявки',M,1,Count(1) FROM REF GROUP BY M

UNION ALL

SELECT 'Поступившие заявки',M & '%',1,100 FROM REF GROUP BY M

UNION ALL

SELECT 'Поступившие заявки','ИТОГО',1,Count(1) FROM REF

UNION ALL

SELECT 'Поступившие заявки','ИТОГО%', 1, 100 FROM REF
]. AS X
GROUP BY ord, DealStage
ORDER BY ord
PIVOT M IN (
'Январь','Январь%',
'Февраль','Февраль%',
'Март','Март%',
'Апрель','Апрель%',
'Май','Май%',
'Июнь','Июнь%',
'Июль','Июль%',
'Август','Август%',
'Сентябрь','Сентябрь%',
'Октябрь','Октябрь%',
'Ноябрь','Ноябрь%',
'Декабрь','Декабрь%',
'ИТОГО','ИТОГО%'
);
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164498
Ainur.smнепоймучкапропущено...
это я понимаю

суть вопроса такова:
для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой)
1) только одну причину или
2) неколько причин - столько сколько оператор поставт галочек?

Программа позволяет выбрать несколько причин.
Если так, то увы - похоже, ваше поле RefuseReasons - это т.н. МНОГОЗНАЧНОЕ поле,
и в этом случае я никак не могу вам помочь - я с ними не знаком.
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164503
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучка,

А если только одну причину??
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164514
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучка,

ПЛЗ. Если учитывать только одну причину...... ((((
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164528
Ainur.smнепоймучка,

А если только одну причину??
Дело не в том, что вы (как юзер) станете заносить туда всегда строго только одну причину.
Дело в том, что данное поле в СТРУКТУРЕ таблицы сделано как МНОГОЗНАЧНОЕ.
А это - не просто текстовое поле, с ним стандартный человеческий SQL работать не умеет.

Многозначные поля - это такая специальная 'ересь', попирающая реляционную стройность баз данных,
которую Microsoft придумал в MSAccess 2007 - специально чтобы позлить всех нормальных людей,
и чтобы работать с этими полями в запросах, добавил в свой офисный SQL какие-то невнятные костыли,
на которых тут мало кому охота ходить.

Вобщем, сочувствую - если найдете помощника по этим полям - считайте повезло
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164604
Ainur.smнепоймучка,

ПЛЗ. Если учитывать только одну причину...... ((((ну ОК.
чтобы как-то закруглить топик, давайте оформим решение с учетом вашего условия, слегка усугубив его:
если "учитывать только одну причину", которая записывается в обычное (НЕмногозначное) текстовое поле RefuseReasons А в этом случае у вас все уже почти готово.
Вот последний вариант вашего SQL для 'причин' (запрос 'Итоговый2'), что вы тут привели:
Ainur.sm
TRANSFORM MIN(N)
SELECT ord, DealStage
FROM (

SELECT DealStage,M,ord,Count(1) AS N FROM SRC GROUP BY M,DealStage,ord
UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
UNION ALL
SELECT DealStage,'ИТОГО',ord,Count(1) FROM REF GROUP BY DealStage,ord
UNION ALL
SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF T,(SELECT Count(1) AS N FROM SRC) S
GROUP BY T.DealStage,T.ord

UNION ALL
SELECT 'Поступившие заявки',M,1,Count(1) FROM REF GROUP BY M
UNION ALL
SELECT 'Поступившие заявки',M & '%',1,100 FROM REF GROUP BY M
UNION ALL
SELECT 'Поступившие заявки','ИТОГО',1,Count(1) FROM REF
UNION ALL
SELECT 'Поступившие заявки','ИТОГО%', 1, 100 FROM REF

) AS X
GROUP BY ord, DealStage
ORDER BY ord
PIVOT M IN (
'Январь','Январь%',
'Февраль','Февраль%',
'Март','Март%',
'Апрель','Апрель%',
'Май','Май%',
'Июнь','Июнь%',
'Июль','Июль%',
'Август','Август%',
'Сентябрь','Сентябрь%',
'Октябрь','Октябрь%',
'Ноябрь','Ноябрь%',
'Декабрь','Декабрь%',
'ИТОГО','ИТОГО%'
);Я выделил тут цветом разные его части.

Черным цветом написано TRANSFORM-обрамление (часть запроса которая занимается 'разворотом' данных по столбцам) -
эта часть на 100% совпадает с первым Итоговым запросом - с которым в итоге мы будем объединять этот запрос (Итоговый2) -
и в едином конечном запросе эта (черная) часть и будет присутствовать (однократно) точно в таком же виде.

Синий и красный- это UNION-запрос, который формирует исходную выборку для предстоящего разворота данных.
И эта часть должна быть ДОБАВЛЕНА в конец аналогичной UNION-части первого Итогового запроса.

При этом, то что написано тут красным - УЖЕ есть в первом Итоговом (по сути, это доп.суммарная строка для двух итоговых строк 'Отказ' и 'Реализация' и она НЕ имеет отношения к причинам), поэтому повторно эту (красную) часть в конечный запрос включать не надо.

Итак, у нас остается только синяя часть запроса, которая и выбирает нужные нам данные по исходным причинам - и только эту часть мы и должны будем вставить в конечный объединенный запрос.
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164607
продолжение

Итак, рассмотрим дорабатываемую часть запроса:
SQLSELECT DealStage,M,ord,Count(1) AS N FROM REF GROUP BY M,DealStage,ord
UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
UNION ALL
SELECT DealStage,'ИТОГО',ord,Count(1) FROM REF GROUP BY DealStage,ord
UNION ALL
SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF T,(SELECT Count(1) AS N FROM SRC WHERE DealStage = 'Отказ' ) S
GROUP BY T.DealStage,T.ord
тут я дополнительно выделил зеленым select-подзапросы, которые считают общее число записей для вычисления процентов, плюс жирным выделил во втором под-select'е условие (ранее нами упущенное) аналогичное первому.
*** красным исправил ошибку в вашем варианте

в этой части итогового запроса все union-select'ы обращаются к (под)запросу REF, который по вашей последней версии таков:
REFSELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, Count(*) AS ord
FROM qdfDeals
WHERE Year(DateClosed)=2015
GROUP BY Format(DateClosed,"mmmm"), RefuseReasonsчто не совсем верно, т.к.
исходный запрос REF (как и запрос SRC) НЕ должен группировать данные.

Его задача (и сам смысл его создания) в другом:
1) выбрать записи из исходных таблиц (откуда надо) с нужным критерием (Year(DateClosed)=2015)
2) преобразовать дату в название месяца (Format(DateClosed,"mmmm"))
3) как-то сформировать (условно) порядковый номер для строки в итоговом запросе (ord)

В запросе SRC этот ord делается выражением IIF(DealStage='Реализация',2,3) AS ord
для того чтобы после сортировки ORDER BY ord в итоговом запросе итоговые строки шли в указанном порядке:
'Реализация' - второй строкой, 'Отказ' - третьей строкой
'Поступившие заявки' будут первой строкой, т.к. в union-select'ах для них везде явно указан ord=1

В случае запроса REF мы могли бы задать этот ord для каждой причины аналогичным выражением с несколькими IIF -
если важен какой-то конкретный порядок причин в итоговом запросе. Если же итоговый порядок причин НЕ важен - главное, чтобы они все оказались там ПОСЛЕ строки 'Отказ' - тогда можно им всем задать одинаковый ord=4 в этом запросе

Ну и наконец, поскольку основная задача данного запроса REF - выбрать записи с причинами отказа , т.е., если я правильно понимаю логику вашей задачи, у всех этих записей в поле DealStage должно быть записано "Отказ" - и значит мы должны добавить соответствующее условие в WHERE этого запроса.

Учитывая все вышесказанное, запрос REF должен выглядеть вот так:
REFSELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, 4 AS ord
FROM qdfDeals
WHERE Year(DateClosed)=2015 AND DealStage = 'Отказ'

Учитывая, что теперь мы включили критерий DealStage = 'Отказ' в запрос REF, в верхнем SQL зеленые подзапросы можно также сделать на основе REF (а не на SRC с этим условием, как ранее), т.е. вот так:
SQLSELECT DealStage,M,ord,Count(1) AS N FROM REF GROUP BY M,DealStage,ord
UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM REF GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
UNION ALL
SELECT DealStage,'ИТОГО',ord,Count(1) FROM REF GROUP BY DealStage,ord
UNION ALL
SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF T,(SELECT Count(1) AS N FROM REF ) S
GROUP BY T.DealStage,T.ord
Вот именно в таком виде данная часть запроса для ПРИЧИН и должна быть ДОБАВЛЕНА в (первый) Итоговый запрос
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164613
завершение

Итак, конечный текст запроса:
запрос(0) ИтоговыйTRANSFORM MIN(N)
SELECT ord, DealStage
FROM
(
SELECT DealStage,M,ord,Count(1) AS N FROM SRC GROUP BY M,DealStage,ord
UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC AS T INNER JOIN (SELECT M,Count(1) AS N FROM SRC GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
UNION ALL
SELECT DealStage,'ИТОГО',ord,Count(1) FROM SRC GROUP BY DealStage,ord
UNION ALL
SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM SRC T,(SELECT Count(1) AS N FROM SRC) S
GROUP BY T.DealStage,T.ord

UNION ALL
SELECT 'Поступившие заявки',M,1,Count(1) FROM SRC GROUP BY M
UNION ALL
SELECT 'Поступившие заявки',M & '%',1,100 FROM SRC GROUP BY M
UNION ALL
SELECT 'Поступившие заявки','ИТОГО',1,Count(1) FROM SRC
UNION ALL
SELECT 'Поступившие заявки','ИТОГО%', 1, 100 FROM SRC

UNION ALL
SELECT DealStage,M,ord,Count(1) AS N FROM REF GROUP BY M,DealStage,ord
UNION ALL
SELECT T.DealStage,T.M & "%",T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF AS T INNER JOIN (SELECT M,Count(1) AS N FROM REF GROUP BY M) S ON T.M=S.M
GROUP BY T.M,T.DealStage,T.ord
UNION ALL
SELECT DealStage,'ИТОГО',ord,Count(1) FROM REF GROUP BY DealStage,ord
UNION ALL
SELECT T.DealStage,'ИТОГО%',T.ord,Round(Count(1)/Min(S.N)*100)
FROM REF T,(SELECT Count(1) AS N FROM REF) S
GROUP BY T.DealStage,T.ord

) AS X

GROUP BY ord, DealStage
ORDER BY ord, DealStage
PIVOT M IN (
'Январь','Январь%',
'Февраль','Февраль%',
'Март','Март%',
'Апрель','Апрель%',
'Май','Май%',
'Июнь','Июнь%',
'Июль','Июль%',
'Август','Август%',
'Сентябрь','Сентябрь%',
'Октябрь','Октябрь%',
'Ноябрь','Ноябрь%',
'Декабрь','Декабрь%',
'ИТОГО','ИТОГО%'
)

Черная часть - первый Итоговый запрос (из той БД, что я выкладывал)
Синий кусок - новая добавка, которую весь вечер мучали, и которая должна дать вам в результате строки со статистикой Причин отказа.
***Красным - опционная добавка, чтобы строки с причинами отсортировать по алфавиту

И для полной отчетности допишу сюда же тексты двух исходных запросов:
запрос(1) SRCSELECT DealStage, Format(DateClosed,"mmmm") AS M, IIF(DealStage='Реализация',2,3) AS ord
FROM qdfDeals WHERE Year(DateClosed)=2015 AND DealStage IN ('Реализация','Отказ')запрос(2) REFSELECT RefuseReasons AS DealStage, Format(DateClosed,"mmmm") AS M, 4 AS ord
FROM qdfDeals WHERE Year(DateClosed)=2015 AND DealStage = 'Отказ'
И еще раз важное замечание по конечному решению:
в этих запросах предполагается, что поле RefuseReasons - обычное текстовое поле, в котором записана ОДНА причина отказа (т.е. это НЕ то многозначное поле RefuseReasons, которое у вас есть сейчас)

И пожелание:
Если у вас есть такая возможность, рекомендую отказаться от использования многозначных полей.
Множественность атрибутов для одной записи некоторой таблицы (как это происходит в вашем случае: несколько причин одного отказа) чудесно реализуется более человечьим способом при помощи одной дополнительной таблицы

P.S.
запросы писал умозрительно, в данный момент проверить не на чем,
поэтому неизбежны ошибки/очепятки, будьте готовы

Успехов.
---
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164636
Ainur.sm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
непоймучка, Спасибо,
А если учитывать, то что причины меняется, точнее если нет из вышеперечисленных то они вводят вручную ??
...
Рейтинг: 0 / 0
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
    #39164653
Ainur.smнепоймучка, Спасибо,
А если учитывать, то что причины меняется, точнее если нет из вышеперечисленных то они вводят вручную ??
во-первых, вы никак не пояснили -что это за список причин, есть ли он в отдельной таблице и т.п.
во-вторых, поскольку вы сказали что поле RefuseReasons - текстовое, значит, в любом случае причины ваши записаны там словами.

Как я оговорил выше, все запросы написаны исходя из того, что RefuseReasons - это обычное текстовое поле, которое хранит причину отказа, записанную в текстовом виде. Поэтому нам неважно как это значение там оказалось - выбрали его из какого-то списка значений, или записали туда программно или забили руками от балды - в нашем запросе группировка идет по полному текстовому значению этого поля.

Так что если кто-то туда запишет свою уникальную причину, которой нет в вашем "виртуальном списке" причин, - она на общих основаниях займет в итоговом отчете отдельную строчку, да и все.
...
Рейтинг: 0 / 0
25 сообщений из 97, страница 2 из 4
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]