Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Индекс с условием  [new]
кма9
Guest
Пожалуйста, подскажете, как правильно сделать выборку с не уникальным индексом (поле "plus"), которое будет инкрементироваться, когда три первые поля (division, subdivision, dept) равны и отличается только colour, в противном случае будет сбрасываться до 1?
Картинка с другого сайта.
29 мар 17, 14:56    [20346810]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
buven
Member

Откуда:
Сообщений: 792
кма9
Пожалуйста, подскажете, как правильно сделать выборку с не уникальным индексом (поле "plus"), которое будет инкрементироваться, когда три первые поля (division, subdivision, dept) равны и отличается только colour, в противном случае будет сбрасываться до 1?
Картинка с другого сайта.


Как гарантируете именно такой порядок строк как на картинке?
Почему 11,3,7,White не в конце?
Например вот так
with CTE (DIV,SUBDIV,Dept,Colour) as (
select 10,3,7,'Grey'
union all
select 10,3,7,'Navy'
union all
select 10,3,7,'Tur'
union all
select 11,3,7,'White'
union all
select 10,3,11,'blue'
union all
select 10,3,11,'NAvy'
union all
select 10,2,11,'Red'
union all
select 10,3,47,'Assorted'
union all
select 10,3,57,'Black'
)
select * from CTE order by div,subdiv,dept
29 мар 17, 15:51    [20347177]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
кма9
Guest
Выборка не сортирована, вводилась в таблицу вручную. При необходимости отсортировать не проблема.
29 мар 17, 16:01    [20347247]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
buven
Member

Откуда:
Сообщений: 792
кма9,

Ну раз версию сервера не указали и сортировать можно как угодно...
with CTE (DIV,SUBDIV,Dept,Colour) as (
select 10,3,7,'Grey'
union all
select 10,3,7,'Navy'
union all
select 10,3,7,'Tur'
union all
select 11,3,7,'White'
union all
select 10,3,11,'blue'
union all
select 10,3,11,'NAvy'
union all
select 10,2,11,'Red'
union all
select 10,3,47,'Assorted'
union all
select 10,3,57,'Black'
)
select t.*,row_number() over(partition by DIV,SUBDIV,Dept order by Colour) as plus from CTE t
29 мар 17, 16:07    [20347289]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
кма9
Guest
buven, большое спасибо за помощь! именно то, что надо!
29 мар 17, 16:37    [20347496]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
кма9
Guest
С селоктом действительно хорошо получается, но что-то никак не могу придумать, как правильно сделать апдейт на основе этого селекта. Ситуация такова: выборка идёт дистинктом из таблицы, а апдейтнуть нужно все подходящие поля этой же таблицы, что-то вроде вот такого:

declare @test table (
  DIV varchar(2),
  SUBDIV varchar(2),
  Dept varchar(2),
  Colour varchar(20),
  Size varchar(20),
  plus int null
);

insert into @test values ('10','3','7','Grey', 'S', null);
insert into @test values ('10','3','7','Grey', 'M', null);
insert into @test values ('10','3','7','Navy', 'S', null);
insert into @test values ('10','3','7','Navy', 'L', null);
insert into @test values ('10','3','7','Navy', 'XL', null);
insert into @test values ('10','3','7','Tur', 'XL', null);
insert into @test values ('10','3','7','Tur', 'M', null);
insert into @test values ('10','3','7','White', 'M', null);
insert into @test values ('10','3','11','blue', '1', null);
insert into @test values ('10','3','11','NAvy', '2', null);
insert into @test values ('10','2','11','Red', '3', null);
insert into @test values ('10','3','47','Assorted', '4', null);
insert into @test values ('10','3','57','Black', '5', null);

with CTE (DIV,SUBDIV,Dept,Colour) as (
select distinct
  DIV,
  SUBDIV,
  Dept,
  Colour
FROM
  @test
)
--select t.*, row_number() over(partition by DIV, SUBDIV, Dept order by Colour) as plus_calc from CTE t
update @test set plus = (select row_number() over(partition by DIV, SUBDIV, Dept order by Colour) from CTE t)
from @test t join CTE x on X.DIV=t.DIV and X.Dept=t.Dept and X.SUBDIV=t.SUBDIV and X.Colour=t.Colour;

select * from @test;

Только тут получается ошибка вида:
автор
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


Я вобщем-то понимаю, что это неправильно, но вот как по уму сделать не получается, не тот скилл...
29 мар 17, 18:10    [20348080]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
кма9
Только тут получается ошибка вида:

Наверное, так:
update t
set plus = x.plus_calc
from @test t 
    join (
        select x.*, row_number() over(partition by DIV, SUBDIV, Dept order by Colour) as plus_calc 
        from CTE x
    ) x 
        on X.DIV=t.DIV and X.Dept=t.Dept and X.SUBDIV=t.SUBDIV and X.Colour=t.Colour;
29 мар 17, 18:22    [20348131]     Ответить | Цитировать Сообщить модератору
 Re: Индекс с условием  [new]
кма9
Guest
alexeyvg, спасибо!
29 мар 17, 18:40    [20348195]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить