[access,sql] Можно ли в запросе получить набор дат(1янв, 2янв) и т.д.?

igorek1

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

oleg701

Странный народ, все хочет скулем решить
Бредовая по постановке задачка, если хочешь прям набор записей такой - пиши хранимку.

igorek1

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

oleg701

Запрос предполагает, что ему есть откуда выбирать.
Если ты создашь рядом табличку со списком всех дат, тогда еще можно что-то решать.
Хранимка - это хранимая процедура.
Но если у тебя Access, то хранимых процедур там нет, и нужно писать макрос.

igorek1

Если ты создашь рядом табличку со списком всех дат, тогда еще можно что-то решать.
Это понятно. Мне казалось, что есть что-нить стандартное (например where date in )
Основная идея в том, чтобы после завершения написания запроса/макроса нужно было делать как можно меньше интелектуальных действий.
Но если у тебя Access
Именно.

oleg701

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

igorek1

у меня есть пример вызова запроса sql из текста макроса.
Только там какая-то некислая структура обращения к таблицам.
Спасибо за совет.

pitrik2

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

oleg701

В оракле стока наворотов, что он наверное и вышивать умеет
Хотя бывает приятно злобную задачу решить красивым запросом.

Ivan8209

> В оракле стока наворотов, что он наверное и вышивать умеет
Постгрес тоже можно научить вышивать, только зачем?
---
"This user is BSD-compliant."

sinet

А как в оракле без хранимки решить?

Corrector

можно
ботай раздел "group by" и функцию count(..)

oleg701

Ага, а пропущенные даты как добавлять будешь?

Corrector

да, этот момент я упустил
даты, которых нет в исходной таблице (count=0) придется добавлять вручную.

Ivan8209

(+) не поможет?
---
...Я работаю антинаучным аферистом...

pitrik2

(+) не поможет?
бред напсиал

pitrik2

А как в оракле без хранимки решить?
1) берем большую таблицу, т.е. в которой данных больше чем всех дат
данные в этой таблице не нужны, но нужна таблица, например таблица логов
2) выводим натуральный ряд
SELECT rownum FROM bigtable;

3) выводим все даты
например с первого января до 10 февраля
SELECT to_date('01.01.07', 'DD.MM.YY') + rownum - 1 AS dates FROM bigtable 
WHERE rownum < (to_date('10.02.07', 'DD.MM.YY') - to_date('01.01.07', 'DD.MM.YY') + 2);

4) далее нам надо скрестить нашу таблицу и вот эту псевдотаблицу всех дат какимнибудь джойном
писать не буду, дальше понятно ...

sinet

Ясно. Только выборка по этой таблице может происходить медленно и плохо параллелиться, или большой таблицы вообще может не быть.

pitrik2

может происходить медленно
почему?
мы же подряд все записи берем
а раз ничего не выбираем, то чтений с диска даж не происходит
а то что таблицы не будет, ее можно спец для такого запроса сделать, одна колонка и заполнить ее наллами, потом пригодится
и потом, что значит медленно?
никто такой запрос не будет в релиз пускать, это делается на клиенте или на худой конец в хранимке
а для быстрого получения данных или для тестов - самое оно

sinet

Из-за блокировок.
Погуглил.
Судя по сравнениям 1 и 2 рулит такой метод, только операвы много жрёт:
select level
from dual
connect by level <= 10 ;
PS Думал, Pipelined Function покажет большую производительность.

pitrik2

клевая статья
не понял про куб
http://www.sqlsnippets.com/en/topic-11823.html
Note 1: In this technique it does not matter what literals you use in the arguments to CUBE. You could use arguments like 1, 1 or 'a','b' and still get the same number of rows. The important part is how many literals you include.
это такая спецификация оракла что там неважно что стоит?
типа мы указываем несуществующий столбец и в нем два значения: какое-то и NULL
вот это вернет 8 единичек
select 1
from dual
group by cube( 1, 2, 3 )

а вот это вернет 7 единичек и один NULL
select 1
from dual
group by cube( 1, 2, 2 )

КАК ТАК?
а этот запрос вернет 6 двоек и два налла
select 2
from dual
group by cube( 1, 2, 2 )

КАК ТАК? откуда наллы то берутся?
может это бага моего оракла, у вас как?
и еще прикол, для первого запроса туад смог построить Explain Plan а для второго и третьего выползло "Access Violation at address ... in module TOAD.exe"

state7401281

> как в оракле без хранимки решить?
рыба:
select level
from dual
connect by 1 = 1 and level <= NNNN

state7401281

блин, уже storm озвучил
Оставить комментарий
Имя или ник:
Комментарий: