насколько я понимаю, нужно использовать сначала отбор по сумме платежей, а потом - посчитать количество уникальных клиентов. с одним отбором (платежная система - "наличные") и группировкой по месяцам. у меня пока получилось решить задачу с помощью промежуточного запроса.
промежуточный: [vba]
Код
SELECT Format(pdate,"mmm\.yyyy") AS pMonth, name, Sum(pSum) AS pmnSum FROM sales WHERE pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy"), name HAVING Sum(pSum)>300;
[/vba]
итог: [vba]
Код
SELECT pMonth, Count(name) AS [Count-name] FROM Запрос1 GROUP BY pMonth;
[/vba]
вопрос: можно ли обойтись одним запросом? (методом тыка у меня ничего не получается) ни COUNT(SUM(...)), ни как-то ещё. вообще есть сомнения, так как агрегатные функции применяются к разным полям.
если можно - то ещё оин вопрос: стоит ли это делать? или способ с промежуточным запросом можно назвать оптимальным?
прикладываю архив БД (mdb, Access 2002)
всем привет. задача не срочная, но захотелось разобраться.
насколько я понимаю, нужно использовать сначала отбор по сумме платежей, а потом - посчитать количество уникальных клиентов. с одним отбором (платежная система - "наличные") и группировкой по месяцам. у меня пока получилось решить задачу с помощью промежуточного запроса.
промежуточный: [vba]
Код
SELECT Format(pdate,"mmm\.yyyy") AS pMonth, name, Sum(pSum) AS pmnSum FROM sales WHERE pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy"), name HAVING Sum(pSum)>300;
[/vba]
итог: [vba]
Код
SELECT pMonth, Count(name) AS [Count-name] FROM Запрос1 GROUP BY pMonth;
[/vba]
вопрос: можно ли обойтись одним запросом? (методом тыка у меня ничего не получается) ни COUNT(SUM(...)), ни как-то ещё. вообще есть сомнения, так как агрегатные функции применяются к разным полям.
если можно - то ещё оин вопрос: стоит ли это делать? или способ с промежуточным запросом можно назвать оптимальным?
В Аксе проще пути не вижу. Правда, невеликий я мастер сиквела, а уж тем более усеченного . Но если работать не в Аксе, а в нормальном сиквеле, то есть такая штука Count (DISTINCT поле). Вот с ней совсем другое дело.
В Аксе проще пути не вижу. Правда, невеликий я мастер сиквела, а уж тем более усеченного . Но если работать не в Аксе, а в нормальном сиквеле, то есть такая штука Count (DISTINCT поле). Вот с ней совсем другое дело._Boroda_
В смысле комбинация Count (DISTINCT название_поля) в Аксе не работает Просто в Оракле должно работать что-то типа (на коленке пишу, без проверки - главное суть) [vba]
Код
SELECT Format(pdate,"mmm\.yyyy") AS pMonth, name, Count (DISTINCT pSum) AS pmnSum FROM sales WHERE pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy") HAVING Sum(pSum)>300;
[/vba]
Цитата (ikki)
в смысле?
В смысле комбинация Count (DISTINCT название_поля) в Аксе не работает Просто в Оракле должно работать что-то типа (на коленке пишу, без проверки - главное суть) [vba]
Код
SELECT Format(pdate,"mmm\.yyyy") AS pMonth, name, Count (DISTINCT pSum) AS pmnSum FROM sales WHERE pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy") HAVING Sum(pSum)>300;
Можно вписать первый запрос внутрь второго и обойтись одним сохраненным запросом: [vba]
Код
SELECT Запрос1.pMonth, Count(Запрос1.name) AS [Count-name] FROM ( SELECT Format(pdate,"mmm\.yyyy") AS pMonth, sales.name, Sum(sales.pSum) AS pmnSum FROM sales WHERE sales.pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy"), sales.name HAVING Sum(sales.pSum)>300 ) AS Запрос1 GROUP BY Запрос1.pMonth
[/vba]
Можно вписать первый запрос внутрь второго и обойтись одним сохраненным запросом: [vba]
Код
SELECT Запрос1.pMonth, Count(Запрос1.name) AS [Count-name] FROM ( SELECT Format(pdate,"mmm\.yyyy") AS pMonth, sales.name, Sum(sales.pSum) AS pmnSum FROM sales WHERE sales.pSystem="наличные" GROUP BY Format(pdate,"mmm\.yyyy"), sales.name HAVING Sum(sales.pSum)>300 ) AS Запрос1 GROUP BY Запрос1.pMonth
Да это-то понятно. Только по сути это все равно 2 запроса - селекта-то два. А вот как извратиться с одним селектом? Да еще так, чтобы в Аксе работал. Я, с моими не столь уж глубокими знаниями SQL, ничего придумать не смог. Да и зачем, собственно?
Цитата (Gustav)
Можно вписать первый запрос внутрь второго
Да это-то понятно. Только по сути это все равно 2 запроса - селекта-то два. А вот как извратиться с одним селектом? Да еще так, чтобы в Аксе работал. Я, с моими не столь уж глубокими знаниями SQL, ничего придумать не смог. Да и зачем, собственно?_Boroda_