2013-04-16 2 views
3

Использование SQL Server 2008, Visual Studio 2012 C# .NET4.5, обоюдного формыSQL Server 2008: обновление прибавка логика трудности

У меня есть сетка данных, которая содержит позволяет сказать, 20 записей, их поле вызова «NewPareto «это поле содержит 1-20 в виде целых чисел, в основном оценка лиги. Обратите внимание, что это поле должно содержать нули.

Если пользователь в сетке изменяет положение 9 в положение 3, мне нужен запрос, который будет прибегать к записи после позиции, которая была обновлена, в основном я думал просто увеличиваем на 1.

Однако я что это не работает, так как всегда есть разрыв, в котором когда-то было 9, и если я говорю что-то большее, чем 3, то уже существует 3, которые существуют.

Я думал об изменении оригинала от 3 до 4, а затем сказал increment> 4. но это все еще не разобрано в 9, кроме того, казалось бы, логика не работает при замене низкого числа до максимума.

Я пробовал некоторый запрос, что последний из них тоже не работает.

ALTER PROCEDURE [dbo].[IncrimentPareto] 
    @pg varchar(255), 
    @Pareto int, 
    @paretostatic int 
AS 
    ;With cte as 
    (select top 1000000 * 
    from ParetoMain 
    where PG = @pg and 
      NewPareto > @paretostatic and 
      NewPareto is not null 
    order by Sales desc) 
    UPDATE cte 
    SET @Pareto = NewPareto = @Pareto +1 

это почти работает, но есть два 3s, которые все еще существуют в настоящее время, и он работает только после позиции 8, поскольку 9 не существует.

Надеюсь, ваши головы не будут измотаны, как у меня.

Резюме: запрос, который сортирует запись с новыми номерами лиги после определенной позиции перемещен вверх или вниз лиги

+0

Хороший вопрос;) + 1 –

ответ

1

Вы можете сделать это с помощью одного оператора обновления, которое будет обновлять только строки, для которых изменений паретовских с помощью функции row_number и немного разумном к югу от запросов:

DECLARE @from int = 9, @to int = 3 

UPDATE MainPareto 
SET pareto = m.new_pareto 
FROM (
    SELECT pKey, -- this is your primary key for the table 
    new_pareto = row_number() 
    over(ORDER BY CASE WHEN pareto = @from THEN @to ELSE pareto END, 
        CASE WHEN pareto = @from THEN 0 ELSE 1 END) 
    FROM MainPareto 
    -- put in any conditions that you want to restrict the scores by. 
    WHERE PG = @pg AND pareto IS NOT NULL 
    -- end condtions 
) as m 
INNER JOIN MainPareto ON MainPareto.pKey = m.pKey 
WHERE MainPareto.pareto <> m.new_pareto 

порядок по статье о «row_number() над» заказов по новым Парето, давая преимущество для новой записи. Если вы хотите, чтобы старший поддерживал его, замените 0 и 1 предложения второго порядка.

+0

отлично, плохо идут проверить это позже в настоящее время застрял на работе я нужно закончить, так что голые со мной и больные возвращаются к вам, приветствует Джонатана – lemunk

+0

, который превосходно! работает отлично! havent полностью протестирован, но я понимаю, что он также работает, если от 3 до 9? – lemunk

+0

сделал некоторые испытания, кажется, это прекрасно, спасибо за помощь помощник! – lemunk

1

Также вы можете использовать опцию с КТР и ROW_NUMBER() функции ранжирования

DECLARE @Pareto int = 2, 
     @NewPareto int = 5 
;WITH cte AS 
( 
    SELECT ID, ROW_NUMBER() OVER (ORDER BY CASE WHEN Pareto = @Pareto THEN @NewPareto ELSE Pareto END) AS Pareto, Col1 
    FROM dbo.test87 
    WHERE Pareto != @Pareto 
),cte2 AS 
(
    SELECT ID, Pareto, @NewPareto AS NewPareto, Col1 
    FROM dbo.test87 
    WHERE Pareto = @Pareto 
    UNION ALL 
    SELECT ID, Pareto, CASE WHEN Pareto >= @NewPareto THEN Pareto + 1 ELSE Pareto END, Col1 
    FROM cte 
) 
    UPDATE t 
    SET t.Pareto = c.NewPareto 
    FROM dbo.test87 t JOIN cte2 c ON t.ID = c.ID 

Демо на SQLFIddle

Смежные вопросы