Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать данные на первое число месяца  [new]
Badhabit
Member

Откуда:
Сообщений: 90
День добрый. Подскажите как сделать следующий запрос.
Есть таблица с данными за каждый день за период например с 1.3.2015 по 1.4.2016
Мне нужно выбрать среднее значение показателя на каждый первый рабочий день месяца в периоде.
Для одного дня пишу так:
Select sum(value) / count(value) from tbl 
Where dt = '2016.03.01'

Но как сделать чтобы вручную каждый раз не прописывать дату? Мне даже не нужно автоматом определять рабочий день или нет, может можно как-нибудь массив дат в ручную написать, а запрос бы по каждой дате сам делал подобный запрос?
31 окт 16, 16:11    [19842688]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Badhabit,

кто ж знает, какого типа у вас поля, и что такое "первый рабочий день месяца"?
Даты, кстати, прописываете строкой так, как хочет ваша левая нога. Будут проблемы с сервером.
31 окт 16, 16:23    [19842778]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
Badhabit
Member

Откуда:
Сообщений: 90
iap
Badhabit,

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

Да, даты у меня строками так что я когда пишу запрос на самом деле использую convert(date, dt, 104) = '2016.03.01'. Числовые поля типа float.
Первый рабочий день думал массивом написать, а вот сейчас думаю ведь его можно определять по полю dt, типа как изменился месяц, значит это первый рабочий день...
Подскажите что можно придумать, а то я в sql совсем "плаваю"
31 окт 16, 16:30    [19842844]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Badhabit,

рабочие дни - это не выходные (суббота, воскресенье)?
И не праздничные дни, и не перенесённые выходные?
Разве не так?
Обычно делают таблицу-календарь.
31 окт 16, 16:37    [19842909]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Badhabit,

почему даты хранятся в строках? Я не понимаю.
31 окт 16, 16:37    [19842915]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
Badhabit,

почему даты хранятся в строках? Я не понимаю.

это глобальный вирус...
автор
рабочие дни - это не выходные (суббота, воскресенье)?
И не праздничные дни, и не перенесённые выходные?
Разве не так?

а ханука? :)
31 окт 16, 16:39    [19842929]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Badhabit
День добрый. Подскажите как сделать следующий запрос.
Есть таблица с данными за каждый день за период например с 1.3.2015 по 1.4.2016
Мне нужно выбрать среднее значение показателя на каждый первый рабочий день месяца в периоде.
Для одного дня пишу так:
Select sum(value) / count(value) from tbl 
Where dt = '2016.03.01'

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


Что-то типа
Select dt, sum(value) / count(value) from tbl 
Where DAY(CAST(dt as DATETIME)) = 1
GROUP BY dt
ORDER BY dt

Но с датами могут быть проблемы при конвертации.
Одному богу известно какие вы данные туда занесли.
31 окт 16, 16:56    [19843028]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Исходя и вышесказанного
Select dt, sum(value) / count(value) from tbl 
Where DAY( convert(date, dt, 104) ) = 1 AND DATEPART('dw',convert(date, dt, 104)) NOT IN (6,7) -- сюда запишете нерабочие дни
GROUP BY dt
ORDER BY dt

Номера нерабочих дней зависят от установок сервера, например для американцев 1- это воскресенье
31 окт 16, 17:00    [19843052]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
iap
Badhabit,

почему даты хранятся в строках? Я не понимаю.

Радуйтесь, что числа не прописью
31 окт 16, 17:02    [19843068]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
Badhabit
Member

Откуда:
Сообщений: 90
Таки наверно да, начать надо было с дат в таблице!
Дело в том, что я импортирую данные в бд из xml (скриптом на vbs и используя SQLXMLBulkLoad), в xml формат дат такой: dd.mm.yyyy, а ms sql у меня английский и по умолчанию формат дат у него yyyy.mm.dd. Как переключить формат на тот который в xml я не нашёл и поэтому сделал поле даты строковым... Подскажите может как поменять формат дат на сервере?
31 окт 16, 17:04    [19843083]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Выбросьте это
 sum(value) / count(value) 

сделайте
 avg(value) 
31 окт 16, 17:04    [19843085]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Badhabit
Таки наверно да, начать надо было с дат в таблице!
Дело в том, что я импортирую данные в бд из xml (скриптом на vbs и используя SQLXMLBulkLoad), в xml формат дат такой: dd.mm.yyyy, а ms sql у меня английский и по умолчанию формат дат у него yyyy.mm.dd. Как переключить формат на тот который в xml я не нашёл и поэтому сделал поле даты строковым... Подскажите может как поменять формат дат на сервере?

Не нужно этого делать!
Заведите еще одно вычислимое поле в таблице, а в формулу пропишите ваше
 convert(date, dt, 104) 
31 окт 16, 17:07    [19843107]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
правильный проходящий.
Guest
Badhabit
в xml формат дат такой: dd.mm.yyyy,
Не верю! (С) Или это не дата, или это не xml.
а ms sql у меня английский
А это без разницы.
и по умолчанию формат дат у него yyyy.mm.dd.
У самого сервера нет форматов даты.
Как переключить формат на тот который в xml я не нашёл и поэтому сделал поле даты строковым... Подскажите может как поменять формат дат на сервере?
Не надо пытаться менять то, чего нет. Надо работать с датами как с датами.
31 окт 16, 17:10    [19843128]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Ну и исключите праздники
Select dt, avg(value) from tbl 
Where DAY( convert(date, dt, 104) ) = 1 AND DATEPART('dw',convert(date, dt, 104)) NOT IN (6,7) -- сб+вс
AND dt NOT IN ('2016.01.01','2016.02.23','2016.03.08', ... ) -- их не так много
GROUP BY dt
ORDER BY dt
31 окт 16, 17:11    [19843131]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
SQL2008
Ну и исключите праздники
Select dt, avg(value) from tbl 
Where DAY( convert(date, dt, 104) ) = 1 AND DATEPART('dw',convert(date, dt, 104)) NOT IN (6,7) -- сб+вс
AND dt NOT IN ('2016.01.01','2016.02.23','2016.03.08', ... ) -- их не так много
GROUP BY dt
ORDER BY dt

правильно, дайте этому ежу ещё больше костылей. Хранить надо в формате даты, править импорт, если речь о рабочих/выходных/праздниках -> создать календарь
ну и для предложенного DATEPART('dw', не забыть про DATEFIRST
31 окт 16, 17:15    [19843163]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
TaPaK
правильно, дайте этому ежу ещё больше костылей.


Хм... со слов ТС
Badhabit
Подскажите что можно придумать, а то я в sql совсем "плаваю"

костыль это то, на чем он хотя бы сможет ходить, а это

TaPaK
Хранить надо в формате даты, править импорт, если речь о рабочих/выходных/праздниках -> создать календарь

может привести его к параличу



TaPaK
ну и для предложенного DATEPART('dw', не забыть про DATEFIRST

Про установки я упоминал.
31 окт 16, 17:22    [19843205]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
Badhabit
Member

Откуда:
Сообщений: 90
правильный проходящий.
Badhabit
в xml формат дат такой: dd.mm.yyyy,
Не верю! (С) Или это не дата, или это не xml.
а ms sql у меня английский
А это без разницы.
и по умолчанию формат дат у него yyyy.mm.dd.
У самого сервера нет форматов даты.
Как переключить формат на тот который в xml я не нашёл и поэтому сделал поле даты строковым... Подскажите может как поменять формат дат на сервере?
Не надо пытаться менять то, чего нет. Надо работать с датами как с датами.

Не, ну честно в xml формат dd.mm.yyyy...
Сделал тестовую таблицу, в ней одно поле типа date, в xml файле дату руками поменял на yyyy.mm.dd - все импортировалось нормально. Если же пытаюсь импортировать с исходной датой (dd.mm.yyyy) при импорте выдаётся ошибка "conversion failed when converting date and/or time from character string". Как быть и что делать?
31 окт 16, 17:52    [19843314]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Badhabit,

обычно в XML формат стандартный ISO - 'YYYY-MM-DDThh:mm:ss.nnn'
31 окт 16, 19:51    [19843569]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные на первое число месяца  [new]
Badhabit
Member

Откуда:
Сообщений: 90
iap,
ну это не стандартный xml и именно с таким форматом данных, можно ли его как-нибудь импортировать?
31 окт 16, 22:31    [19843915]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить