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

Откуда:
Сообщений: 20
Добрый вечер,

Есть проблема при запуске курсора. Общая мысль - есть таблица, отсортированная по "полю 1" и по полю "Доля", запускается курсор по селекту из этой таблицы, который работает по полю "Нарастающий итог", где определяется - если значение меньше 0,5, то А, если больше 0,5 и меньше 0,75, то В и т.д. АВС анализ т.е.
проблема в том, что видимо при селекте сортировка сбивается. Подскажите как это победить? Спасибо
Поле1 Доля Нарастающий итог
1 0,6 0,6
1 0,25 0,85
1 0,15 1
2 0,45 0,45
2 0,25 0,7
2 0,15 0,85
2 0,15 1
3 0,5 0,5
3 0,4 0,9
3 0,05 0,95
3 0,05 1
6 дек 11, 20:38    [11716761]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
Пользователь23,

если сортировка задана, то никуда она не собьется. и зачем тут курсор? может обычный CASE нужен?
case when [Нарастающий итог]<0.5 then A, when [Нарастающий итог]>=0.5 and [Нарастающий итог]<0.75 then B end

ну и так далее
6 дек 11, 20:43    [11716799]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

понял, что не так написал, сбивается на пересчете нарастающего итога, судя по всему при селекте нарушается сортировка и поля в "поле1" начинают менятся местами, но не все. Может селект выбирать данные произвольно из таблицы отсортированной, т.е не сохранять сортировку?
6 дек 11, 21:02    [11716914]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Таблица в реляционной СУБД не может быть отсортированной. Сортировка должна выполняться в запросе. И... совсем не понятно, зачем здесь курсор.
6 дек 11, 21:12    [11716970]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Пользователь23,

1. Курсор не нужен - выбросить его.
2. Где текст курсора? Зачем здесь выкладывать сочинение в двух томах?
6 дек 11, 21:18    [11717005]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

может, конечно, есть более легкий способ, подскажите, пож, тогда
у нас курсор бегает по строкам, запоминает значение предыдущего нарастающего итога, число в "поле 1", если номер в "поле 1" не поменялся, то прибавляет долю, если номер поменялся, то нарастающий накапливается заново
6 дек 11, 21:22    [11717029]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

текста нет, на работе, сочинение, чтоб понятней было
подскажите как считать нарастающий итог согласно предыдущей строки без курсора
6 дек 11, 21:23    [11717038]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Чем в приведенных Вами данных определяется "предыдущесть" строки?
6 дек 11, 21:25    [11717048]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

записывается значение из "поле1" и нарастающий итог, перескакивает на следующую, если значение из "поле 1" не поменялось, то к предыдущему полю нарастающего итога прибавляется текущая доля (это все циклом вайл), итак пока номер в "поле 1" не поменяется, как номер поменялся, нарастающий меняется заново

строка это - в первом письме: "поле 1", "доля", "нарастающий итог"
6 дек 11, 21:37    [11717135]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
предыдущей строки ... перескакивает на следующую


Еще раз... Понятия "предыдущая" и "следующая" применимы к записям отсортированного набора. Какое поле в Вашем наборе отвечает за порядок следования записей?
6 дек 11, 21:41    [11717157]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
pkarklin
Пользователь23,

Чем в приведенных Вами данных определяется "предыдущесть" строки?


Как чем, конечно же физическим расположением строк в индексе по которому сервер решил сделать выборку. :)

Пользователь23,

Почему именно так?
Поле1 Доля Нарастающий итог
1 0,6 0,6
1 0,25 0,85
1 0,15 1

А не скажем, вот так?
Поле1 Доля Нарастающий итог
1 0,15 0,15
1 0,25 0,4
1 0,6 1,0


Пользователь23
записывается значение из "поле1" и нарастающий итог, перескакивает на следующую, если значение из "поле 1" не поменялось, то к предыдущему полю нарастающего итога прибавляется текущая доля (это все циклом вайл), итак пока номер в "поле 1" не поменяется, как номер поменялся, нарастающий меняется заново


А вы сортировку то по каким полям задали и в каком порядке? А то может у вас значения в Поле1 вперемешку идут. И номер в Поле1 меняется и меняется.
6 дек 11, 21:48    [11717195]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

сортировка по полю "поле 1" по возрастанию и по полю "доля" по убыванию, т.е. внутри "поле 1" с одинаковыми цифрами идет сортировка по долям от лучшей к худшей
если так понял
6 дек 11, 21:48    [11717201]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

нарастание нужно от большего к меньшему, т.е. позиции с большей долей учитываются в первую очередь
сортировка по "поле 1" -возрастание, "доля" - убывание
6 дек 11, 21:54    [11717225]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

нарастание нужно от большего к меньшему, т.е. позиции с большей долей учитываются в первую очередь
сортировка по "поле 1" -возрастание, "доля" - убывание
6 дек 11, 21:57    [11717235]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

нарастание нужно от большего к меньшему, т.е. позиции с большей долей учитываются в первую очередь
сортировка по "поле 1" -возрастание, "доля" - убывание
6 дек 11, 21:58    [11717244]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Отлично! Порядок сортировки определили. Теперь считаем нарастающий итог, заглянув в FAQ: https://www.sql.ru/faq/faq_topic.aspx?fid=125 , пронумеровав записи внутри группы с помощью ROW_NUMBER() OVER(PARTITION BY [поле1] ORDER BY [доля] DESC).

Сообщение было отредактировано: 6 дек 11, 22:27
6 дек 11, 22:09    [11717309]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

пишет Возможно вы неправильно набрали URL или FAQ с таким ID не существует
6 дек 11, 22:25    [11717422]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Поправил.
6 дек 11, 22:27    [11717437]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

спасибо большое, попробуем
6 дек 11, 22:36    [11717507]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

Откуда:
Сообщений: 20
Добрый день. Нарастающий итог посчитать получилось, но при изменении цифры в "поле1", счетчик не сбивается.
Подскажите, пож, как это можно сделать.
7 дек 11, 09:32    [11718813]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Покажите свой код.
7 дек 11, 09:42    [11718865]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

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

declare @tot_sum real --decimal(10,2)
set @tot_sum = 0
update Assort_dynamics.dbo.доли_4_поля_сорт set @tot_sum = сум = @tot_sum + ISNULL(доли, 0)
7 дек 11, 09:43    [11718874]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

Откуда:
Сообщений: 20
Таблица выглядит после обновления так:
номер доли сум
1 0,97 0,97
1 0,03 1,00
2 0,44 1,44
2 0,13 1,57
2 0,09 1,66
2 0,07 1,73
2 0,05 1,78
2 0,02 1,80
2 0,01 1,81
2 0,00 1,81
3 0,41 2,22
3 0,37 2,59
3 0,10 2,70
3 0,04 2,74
3 0,03 2,77
3 0,02 2,79
3 0,01 2,80
3 0,01 2,81
3 0,00 2,81
3 0,00 2,81
3 0,00 2,81
7 дек 11, 09:47    [11718897]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
Пользователь23
Member

Откуда:
Сообщений: 20
А надо, чтобы выглядела так:
номер доли сум
1 0,97 0,97
1 0,03 1,00
2 0,44 0,44
2 0,13 0,57
2 0,09 0,66
2 0,07 0,73
2 0,05 0,78
2 0,02 0,80
2 0,01 0,81
2 0,00 0,81
3 0,41 0,41
3 0,37 0,78
3 0,10 0,88
3 0,04 0,92
3 0,03 0,96
3 0,02 0,97
3 0,01 0,99
3 0,01 0,99
3 0,00 1,00
3 0,00 1,00
3 0,00 1,00
7 дек 11, 10:41    [11719248]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и использование курсора  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Пользователь23,

Ну, из исходных данных - не совсем так:

DECLARE @T TABLE (col1 int, col2 numeric(15, 2))

INSERT @T VALUES
(1, 0.97),
(1, 0.03),
(2, 0.44),
(2, 0.13),
(2, 0.09),
(2, 0.07),
(2, 0.05),
(2, 0.02),
(2, 0.01),
(2, 0.00),
(3, 0.41),
(3, 0.37),
(3, 0.10),
(3, 0.04),
(3, 0.03),
(3, 0.02),
(3, 0.01),
(3, 0.01),
(3, 0.00),
(3, 0.00),
(3, 0.00)

;WITH CTE (col1, col2, RN)
AS
(
  SELECT
    col1,
    col2,
    ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2 DESC) AS RN
  FROM
    @T
)

SELECT
  col1,
  col2,
  (SELECT SUM(col2) FROM CTE C2 WHERE C2.col1 = C1.col1 AND C2.RN <= C1.RN) AS RunningTotal
 FROM 
   CTE C1


col1        col2                                    RunningTotal
----------- --------------------------------------- ---------------------------------------
1 0.97 0.97
1 0.03 1.00
2 0.44 0.44
2 0.13 0.57
2 0.09 0.66
2 0.07 0.73
2 0.05 0.78
2 0.02 0.80
2 0.01 0.81
2 0.00 0.81
3 0.41 0.41
3 0.37 0.78
3 0.10 0.88
3 0.04 0.92
3 0.03 0.95
3 0.02 0.97
3 0.01 0.98
3 0.01 0.99
3 0.00 0.99
3 0.00 0.99
3 0.00 0.99

(21 row(s) affected)
7 дек 11, 11:10    [11719446]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить