|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучкаAinur.smнепоймучка, и как сделать? может кроме SRC создать новый запрос? Отдельно для причин ?так, стоп. я, видать, недопонял то есть, Реализация и Отказ - это отдельная песня (в поле DealStage) - и с ней мы разобрались, но КРОМЕ того, у вас есть ЕЩЕ одно поле (RefuseReasons), где пишутся причины отказа, так? 1) какого типа это поле? 2) показанная вами картинка со списком причин - еэто вы просто так, или у вас есть ОТДЕЛЬНАЯ таблица со списокм причин (типа справочник причин) 3) вы пишете "кроме Реализация и Отказа мне надо добавить" - добавить в ЭТОТ же запрос? в какое место, в каком порядке? можете как-то образец желаемого итогового результата показать для примера? Да все верно. 1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой. 2. Надо посчитать кол-во каждой причин. Например Кол-во записей со значением поле(DealStage) равным "Отказ" и со значением поле ПРичины отказа (RefuseReasons) равным "Не устроило время ответа". И Процент – как отношение количества отказных заявок по причине «Не устроило время ответа» к общему количеству отказных заявок. Кол-во "Не устроило время ответа"/ кол-во отказ *100 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 19:39 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.sm, если все так, то да - можно и так. т.е. создаете еще один запрос (например REF) по аналогии с SRC - только для поля RefuseReasons причем, чтобы меньше потом менять в итоговом запросе, лучше сделать там этому полю выходной алиас с тем же именем, что и в запросе SRC (DealStage) вот в таком духе: Код: vbnet 1.
потом попробуйте (для начала) сделать ЕЩЕ один запрос, скопируйте в него целиком текст запроса 'Итоговый' замените там SRC на REF и посмотрите на результат (только суммы, проценты позже) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 19:40 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка, Создала REF для RefuseReasons. SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Format(DateClosed,"yyyy") AS Y FROM qdfDeals WHERE Year(DateClosed)=2015; а Куда это писать. SELECT RefuseReasons AS DealStage,... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 19:46 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
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?? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 19:48 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smAinur.smпропущено... кол-во причины "Неустроило время ответа" разделить на кол-во "ОТКАЗ" * 100%это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа Код: vbnet 1.
и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100 А для случая запроса с причинами вам надо в Итоговом запросе в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида Код: vbnet 1.
и кстати, в ЭТОМ под-select'е надо выбирать именно FROM SRC (а не FROM REF), ибо отказы у вас - в SRC ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 19:54 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка, не так быстро...... создала REF SELECT RefuseReasons, Format(DateClosed,"mmmm") AS M, Count(*) AS ord FROM qdfDeals WHERE Year(DateClosed)=2015 GROUP BY Format(DateClosed,"mmmm"), RefuseReasons; ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:00 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучкаAinur.smпропущено... кол-во причины "Неустроило время ответа" разделить на кол-во "ОТКАЗ" * 100%это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа Код: vbnet 1.
и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100 А для случая запроса с причинами вам надо в Итоговом запросе в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида Код: vbnet 1.
и кстати, в ЭТОМ под-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 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:07 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
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.
а вот тут: Ainur.sm1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой. а что это за "галочки"? (начинаю подозревать плохое) уточните - вот у вас есть текстовое поле RefuseReasons в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи? путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:08 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучкапропущено... это можно сделать по аналогии с тем как, сейчас считается % к ОБЩЕМУ числу записей в Итоговом запросе посмотрите - там в одном из UNION-подзапросов есть inner join на вложенный под(select), который считает это общее число записей, типа Код: vbnet 1.
и это полученное число потом идет как знаменатель в расчете % текушего показателя - Count(1)/Min(S.N)*100 А для случая запроса с причинами вам надо в Итоговом запросе в аналогичном под-select'е посчитать НЕ общее число записей, а только отказы - т.е. добавить условие вида Код: vbnet 1.
и кстати, в ЭТОМ под-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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:12 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучкаAinur.smпропущено... вот так Код: vbnet 1. 2.
а вот тут: Ainur.sm1. Существует поле (RefuseReasons), где перечислены причины отказа как на скриншоте. (Тип String) выбирается галочкой. а что это за "галочки"? (начинаю подозревать плохое) уточните - вот у вас есть текстовое поле RefuseReasons в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи? путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи? Галочка для выбора из перечисленных причин. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:12 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучкапропущено... вот так Код: vbnet 1. 2.
а вот тут: пропущено... а что это за "галочки"? (начинаю подозревать плохое) уточните - вот у вас есть текстовое поле RefuseReasons в него что - можно вписать НЕСКОЛЬКО этих самых причин для ОДНОЙ записи? путем расстановки этих самых 'галочек' напротив нужных причин - и они все запишутся как значение этого поля для текущей записи? Галочка для выбора из перечисленных причин.это я понимаю суть вопроса такова: для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой) 1) только одну причину или 2) неколько причин - столько сколько оператор поставт галочек? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:17 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка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.
Вот что получилось Итоговый запрос 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:19 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучкаAinur.smпропущено... Галочка для выбора из перечисленных причин.это я понимаю суть вопроса такова: для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой) 1) только одну причину или 2) неколько причин - столько сколько оператор поставт галочек? Программа позволяет выбрать несколько причин. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:27 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучкапропущено... Добавить - в смысле просто where добавить к тому, что было и все Код: vbnet 1. 2. 3.
Вот что получилось Итоговый запрос... в этом Итоговом надо заменить SRC на REF - везде кроме под-select'ов ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:28 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучкаа что это за "галочки"? (начинаю подозревать плохое) Подозрения наверняка оправдаются. Скорее всего галочки многозначное поле и надо проверять Value многозначного поля на соответствие условиям. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:29 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
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 ( 'Январь','Январь%', 'Февраль','Февраль%', 'Март','Март%', 'Апрель','Апрель%', 'Май','Май%', 'Июнь','Июнь%', 'Июль','Июль%', 'Август','Август%', 'Сентябрь','Сентябрь%', 'Октябрь','Октябрь%', 'Ноябрь','Ноябрь%', 'Декабрь','Декабрь%', 'ИТОГО','ИТОГО%' ); ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:34 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучкапропущено... это я понимаю суть вопроса такова: для ОДНОЙ (текущей) записи в qdfDeals таким образом можно выбрать (галочкой) 1) только одну причину или 2) неколько причин - столько сколько оператор поставт галочек? Программа позволяет выбрать несколько причин. Если так, то увы - похоже, ваше поле RefuseReasons - это т.н. МНОГОЗНАЧНОЕ поле, и в этом случае я никак не могу вам помочь - я с ними не знаком. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:40 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка, А если только одну причину?? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:42 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка, ПЛЗ. Если учитывать только одну причину...... (((( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 20:53 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучка, А если только одну причину?? Дело не в том, что вы (как юзер) станете заносить туда всегда строго только одну причину. Дело в том, что данное поле в СТРУКТУРЕ таблицы сделано как МНОГОЗНАЧНОЕ. А это - не просто текстовое поле, с ним стандартный человеческий SQL работать не умеет. Многозначные поля - это такая специальная 'ересь', попирающая реляционную стройность баз данных, которую Microsoft придумал в MSAccess 2007 - специально чтобы позлить всех нормальных людей, и чтобы работать с этими полями в запросах, добавил в свой офисный SQL какие-то невнятные костыли, на которых тут мало кому охота ходить. Вобщем, сочувствую - если найдете помощника по этим полям - считайте повезло ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2016, 21:09 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
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-части первого Итогового запроса. При этом, то что написано тут красным - УЖЕ есть в первом Итоговом (по сути, это доп.суммарная строка для двух итоговых строк 'Отказ' и 'Реализация' и она НЕ имеет отношения к причинам), поэтому повторно эту (красную) часть в конечный запрос включать не надо. Итак, у нас остается только синяя часть запроса, которая и выбирает нужные нам данные по исходным причинам - и только эту часть мы и должны будем вставить в конечный объединенный запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 00:16 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
продолжение Итак, рассмотрим дорабатываемую часть запроса: 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 Вот именно в таком виде данная часть запроса для ПРИЧИН и должна быть ДОБАВЛЕНА в (первый) Итоговый запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 00:22 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
завершение Итак, конечный текст запроса: запрос(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. запросы писал умозрительно, в данный момент проверить не на чем, поэтому неизбежны ошибки/очепятки, будьте готовы Успехов. --- ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 00:31 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
непоймучка, Спасибо, А если учитывать, то что причины меняется, точнее если нет из вышеперечисленных то они вводят вручную ?? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 01:26 |
|
Как использовать Count "с условиями" с разбивкой по заданным периода(по месяцам) Access
|
|||
---|---|---|---|
#18+
Ainur.smнепоймучка, Спасибо, А если учитывать, то что причины меняется, точнее если нет из вышеперечисленных то они вводят вручную ?? во-первых, вы никак не пояснили -что это за список причин, есть ли он в отдельной таблице и т.п. во-вторых, поскольку вы сказали что поле RefuseReasons - текстовое, значит, в любом случае причины ваши записаны там словами. Как я оговорил выше, все запросы написаны исходя из того, что RefuseReasons - это обычное текстовое поле, которое хранит причину отказа, записанную в текстовом виде. Поэтому нам неважно как это значение там оказалось - выбрали его из какого-то списка значений, или записали туда программно или забили руками от балды - в нашем запросе группировка идет по полному текстовому значению этого поля. Так что если кто-то туда запишет свою уникальную причину, которой нет в вашем "виртуальном списке" причин, - она на общих основаниях займет в итоговом отчете отдельную строчку, да и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2016, 02:13 |
|
|
start [/forum/topic.php?fid=45&msg=39164460&tid=1613813]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
others: | 328ms |
total: | 499ms |
0 / 0 |