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

Откуда:
Сообщений: 16
Есть таблица с данными
ID_SumManagerIDPeriod
4242132013-07-01
5252132014-01-01
640.002132014-08-01



Помогите заполнить недостающие периоды т.е. мне необходимо получить
такого вида

ID_SumManagerIDPeriod
4242132013-07-01
4242132013-07-02
4242132013-07-03
....
4242132014-12-31
5252132014-01-01
5252132014-01-02
5252132014-01-03
....
5252132014-07-31
640.02132014-08-01
....
640.0213по текущую дату


К сообщению приложен файл. Размер - 11Kb
17 окт 17, 13:50    [20875892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3351
Как пробовал? Что получилось?
17 окт 17, 13:54    [20875910]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
DrilLer,

таблицу календарь или на лету её генерируйте и JOIN на свою таблицу с данными
17 окт 17, 13:56    [20875925]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
DrilLer
Member

Откуда:
Сообщений: 16
Я пробывал через cross join и по календарю
В итоге у меня периоды пересекались

SELECT distinct s._Sum, s.intManagerInfoID,p.MONTH_KEY,s.regionID
from Period as p cross join FactManagerSalary as s
where s.intManagerInfoID = 240

К сообщению приложен файл. Размер - 13Kb
17 окт 17, 14:25    [20876102]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3351
А зачем тебе cross join ?
Тебе нужен left join от календаря.
17 окт 17, 14:29    [20876123]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
DrilLer
Member

Откуда:
Сообщений: 16
Вот так тоже пробовал
 SELECT  distinct      s.intFactManagerSalaryID, s._Sum,s.intManagerInfoID, s.RegionID, p.DATE,s.PeriodO
FROM            FactManagerSalary AS s LEFT OUTER JOIN
                         Period AS p ON dateadd(year,-2000,s.PeriodO) <= cast('2013-07-01'as date)
WHERE        (s.intManagerInfoID = 213 )
order by p.DATE


К сообщению приложен файл. Размер - 79Kb
17 окт 17, 14:41    [20876189]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3351
Ты добейся сначала NULL во всех "промежутках".
А потом думай, как его заполнить правильными значениями.
17 окт 17, 14:49    [20876221]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
ТС,
там у тебя должны быть две повязки по ID+ManagerID
17 окт 17, 14:51    [20876228]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
DrilLer
Member

Откуда:
Сообщений: 16
982183
Ты добейся сначала NULL во всех "промежутках".
А потом думай, как его заполнить правильными значениями.


SELECT   distinct     s.intFactManagerSalaryID, s._Sum, p.MONTH_KEY, s.PeriodID, p.MONTH, p.YEAR
FROM            Period AS p LEFT OUTER JOIN
                         FactManagerSalary AS s ON p.MONTH_KEY = s.PeriodID AND s.intManagerInfoID = 213
						 order by p.YEAR,p.MONTH

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

К сообщению приложен файл. Размер - 81Kb
17 окт 17, 15:12    [20876306]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3351
А теперь думай, как заполнить все NULL
значениями с предшествующей записи.
17 окт 17, 15:16    [20876322]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Massa52
Member

Откуда:
Сообщений: 379
DrilLer,

В MONTH_KEY 2013010 - надо бы подправить. Убрать нолик перед 10
17 окт 17, 15:40    [20876455]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
DrilLer
Member

Откуда:
Сообщений: 16
Massa52
DrilLer,

В MONTH_KEY 2013010 - надо бы подправить. Убрать нолик перед 10

так и надо.

В итогу родил вот что

select *, _sum=max(Sum_old) over (PARTITION BY c)
from ( 
SELECT   distinct     s.intFactManagerSalaryID, p.MONTH_KEY, p.MONTH, p.YEAR
,s._Sum as Sum_old
,c=count(s._sum) over (order by p.YEAR,p.MONTH_KEY)
FROM            Period AS p LEFT JOIN
                         FactManagerSalary AS s ON p.MONTH_KEY = s.PeriodID AND s.intManagerInfoID = 213
						 
where p.YEAR >=2013
)  p

order by p.YEAR,p.MONTH


К сообщению приложен файл. Размер - 113Kb
17 окт 17, 16:36    [20876689]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3351
Ты упрости задачу. Попробуй её решить для одного поля. (ID, Period)
А потом уже конвертируй её для практического применения.
18 окт 17, 02:23    [20877742]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
DrilLer, версия какая?
Получи таблицу вида sum, prev, next

ID _Sum ManagerID prev next
4 24 213 2013-07-01 2014-01-01
5 25 213 2014-01-01 2014-08-01
6 40.00 213 2014-08-01 4321-01-01

А потом сделай джоин к таблице календаря по date >= prev AND date < next
19 окт 17, 18:56    [20883758]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить