powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нутром чую, что литр.
3 сообщений из 3, страница 1 из 1
Нутром чую, что литр.
    #39822910
i-n-d-e-x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Подскажите, пожалуйста, имеет ли вообще смысл делать такое на SQL?
Есть такая таблица
Declare @t table (aID int, bID int, Cnt real)
insert into @t
select 1, 1 ,0.0 union all
select 2, null ,null union all
select 3, null ,null union all
select 4, null ,null union all
select 5, null ,null union all
select 6, null ,null union all
select 7, 7 ,4444 union all
select 8, null ,null union all
select 9, null ,null union all
select 10, 10 ,1234

Надо посчитать количество записей со значением NULL в поле Cnt между записями с ненулевым значением Cnt. Затем Значение Cnt разделить на количество записей и умножить на номер строки между ненулевыми значениями.
В результате должна получиться такая таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
aID	bID	Cnt	cntRec dtSumma
1	1	0	0	0
2	NULL	NULL	1	222
3	NULL	NULL	2	444
4	NULL	NULL	3	666
5	NULL	NULL	4	888
6	NULL	NULL	5	1110
7	7	1332	6	1332
8	NULL	NULL	1	411
9	NULL	NULL	2	822
10	10	1233	3	1233
...
Рейтинг: 0 / 0
Нутром чую, что литр.
    #39822967
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
i-n-d-e-x, 2012+

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select b.aID
     , b.bID
     , b.Cnt
     , b.cntRec
     , b.grCnt
     / max(b.cntRec) over(partition by b.nID)
     * b.cntRec as dtSumma
  from (select a.aID
             , a.bID
             , a.Cnt
             , a.nID
             , max(a.Cnt) over(partition by a.nID) as grCnt
             , row_number() over(partition by a.nID order by a.aID) as cntRec
          from (select t.aID
                     , t.bID
                     , t.Cnt
                     , min(t.bID) over(order by t.aID desc) as nID
                     , lag(t.bID, 1, null) over(partition by case
                                                              when t.bID is null then 0
                                                              else 1
                                                             end order by aID) as lID
                  from @t as t) as a) as b

 order by b.aID;
...
Рейтинг: 0 / 0
Нутром чую, что литр.
    #39823223
i-n-d-e-x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nullin, огромное спасибо. Красиво. Про LAG() и LEAD() даже не догадывался.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нутром чую, что литр.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]