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

Откуда:
Сообщений: 22
Всем доброго времени суток,
встал такой вопрос:
есть таблица типа

номер документа | сумма | номер периода
-------------------------------------------
1 12 38
1 0 38
1 100 39
1 132 39
1 165 39
1 16 40
и т.д.
Максимальное кол-во строк с одним периодом = 3. Но бывает, как в примере выше, 2 строки, а может быть и 1, но обязательно 1 строка с периодом есть. Также в таблице есть строки и для других номер документов.
А мне нужно, чтобы было обязательно для каждого периода 3 строки, как для периода 39, а в значении сумма пусть будет 0 или null.
номер документа | сумма | номер периода
-------------------------------------------
1 12 38
1 0 38
1 null 38
1 100 39
1 132 39
1 165 39
1 16 40
1 null 40
1 null 40

Подскажите, пожалуйста, с решением вопроса. Заранее спасибо!
21 июл 16, 12:42    [19435663]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
rukesa
Member

Откуда:
Сообщений: 22
прошу прощения за таблицу, не вышло красиво сделать, но, наверное, суть понятна?
21 июл 16, 12:43    [19435671]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
o-o
Guest
declare @t table (n int, s int, p int)
insert into @t
values
(1, 12, 38),
(1, 0, 38),
(1, 100, 39),
(1, 132, 39),
(1, 165, 39),
(1, 16, 40);

with nums as
(
select 1 as n union all select 2 union all select 3
),

t_rn as
(
select *, 
       row_number() over(partition by p order by s) as rn
from @t
),

p as
(
select distinct n,p
from @t
)

select p.n, t.s, p.p
from p cross join nums n 
     left join t_rn t
        on t.rn = n.n and p.p = t.p;

?
21 июл 16, 13:13    [19435939]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,
эххх :)

автор
DECLARE @Table TABLE
(
Id INT,
Suma MONEY,
Nper INT
)
INSERT INTO @Table
(
Id ,
Suma,
Nper
)
VALUES
(1, 12 ,38),
(1, 0 ,38),
(1, 100 ,39),
(1, 132 ,39),
(1, 165 ,39),
(1, 16 ,40)

;WITH cx AS
(
SELECT DISTINCT
x.Id,
x.Nper,
b.Rn
FROM @Table x
CROSS JOIN
(
SELECT
Rn
FROM (VALUES (1),(2),(3)) as a(Rn)
) as b
),
yy AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY Nper ORDER BY Nper) as Rn,
*
FROM @Table
)
SELECT
a.Rn,
b.Id,
b.Suma,
b.Nper
FROM
cx a
LEFT JOIN
yy b
ON
b.Rn = a.Rn AND
b.Id = a.Id AND
b.Nper = a.Nper
ORDER BY
a.Nper,
a.Id,
a.Rn
21 июл 16, 13:39    [19436203]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
Mairos
Member

Откуда:
Сообщений: 555
TaPaK, маленько не то возвращает..

Rn	Id	Suma	        Nper
1	1	12.00	        38
2	1	0.00	        38
3	NULL	NULL	        NULL
1	1	100.00	        39
2	1	132.00	        39
3	1	165.00	        39
1	1	16.00	        40
2	NULL	NULL	        NULL
3	NULL	NULL	        NULL



.. у о-о првильно..
n	s	p
1	0	38
1	12	38
1	NULL	38
1	100	39
1	132	39
1	165	39
1	16	40
1	NULL	40
1	NULL	40
21 июл 16, 13:46    [19436282]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
TaPaK
Member

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

т.е. переставить одну букву под себя нет сил?

SELECT 	
	b.Id,
	b.Suma,
	a.Nper
FROM 
	cx	a
LEFT JOIN	
	yy	b
ON
	b.Rn = a.Rn	AND
	b.Id = a.Id	AND
	b.Nper = a.Nper
ORDER BY
	a.Nper,
	a.Id,
	a.Rn
21 июл 16, 13:49    [19436316]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по заполнению строк в таблице  [new]
rukesa
Member

Откуда:
Сообщений: 22
Большое спасибо!!! Буду пробовать.
21 июл 16, 14:38    [19436750]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить