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

Откуда: Украина
Сообщений: 334
Цена К-во Дата
10 1 1
11 10 2
12 1 4


Нужно

Цена Дата
10 1
11 2
11 2
11 2
11 2
11 2
11 2
11 2
11 2
11 2
11 2
12 4


То есть разгруппировать по количеству. Я где-то видел решние этой задачи, но в моём случае оно не подошло, потому что:

В поле количество может быть более 100 тысяч, самих же строк будет около 500т. В итоге выйдет не хило. Есть идеи как реализовать чисто средствами SQL Server 2012?
28 июн 14, 23:09    [16234349]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Kimel
То есть разгруппировать по количеству. Я где-то видел решние этой задачи, но в моём случае оно не подошло, потому что:

В поле количество может быть более 100 тысяч, самих же строк будет около 500т. В итоге выйдет не хило. Есть идеи как реализовать чисто средствами SQL Server 2012?
Используйте джойн с таблицей чисел.

Все посты от вас какие то непонятные. Почему не подошло? Что не подошло? Какой способ?
28 июн 14, 23:42    [16234441]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
alexeyvg,

Я имел ввиду, что мне не подходять "ручные" решения и всякие динамические, курсоры, процедуры и тд. Вот я порылся на форуме и нашёл ответ, спасибо великому qwerty112, он меня уже ни раз выручает. Ей богу столько сколько он мне помог, ещё никто не помог. Правда не вижу его уже последнее время, но это уже совсем другая история...
DECLARE @table table(Id int, Value float, SplitCount int);

INSERT INTO @table
VALUES(1, 100.0, 2), (2, 3600.0, 3)
select * from @table
;
with cte as
(select Id, Value as result, 1 as num 
from @table

union all

select cte.Id, cte.result, cte.num + 1
from cte inner join @table t on cte.Id=t.Id
where cte.num + 1 <= t.SplitCount)

select result from cte order by Id
29 июн 14, 00:00    [16234495]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
_human
Member

Откуда:
Сообщений: 569
declare @t table (price int, qty int, data int);
insert into @t (price, qty, data) values (10,	1,	1)
insert into @t (price, qty, data) values (11,	10,	2)
insert into @t (price, qty, data) values (12,	1,	4)

;with q(a) as (select 1 union all select 1 union all select 1 union all select 1)
, nums(n) as (select ROW_NUMBER() over(order by (select null)) from q, q q1, q q2, q q3, q q4/*, q q5, q q6, q q7*/)

select t.price, t.data, t.qty 
from @t t
	join nums n on t.qty >= n.n
order by t.price		
29 июн 14, 12:37    [16235068]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
_human
Member

Откуда:
Сообщений: 569
p.s. сделать "операцию обратную группировке" невозможно.
29 июн 14, 12:39    [16235070]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
_human,

А жалко, SQL такой старый язык, а такую банальную функцию не придумали.
Ведь есть же PIVOT и UNPIVOT? А этого нет
29 июн 14, 14:20    [16235224]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kimel
а такую банальную функцию не придумали.

Только то, что вы хотите получить, называется вовсе не "операция, обратная группировке"
29 июн 14, 15:14    [16235327]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Инструкция языка?
29 июн 14, 15:54    [16235410]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Kimel
Вот я порылся на форуме и нашёл ответ, спасибо великому qwerty112, он меня уже ни раз выручает.
Это решение исполняется на SQL Server как цикл. Так что если "В поле количество может быть более 100 тысяч, самих же строк будет около 500т. В итоге выйдет не хило.", то цикл на 100 тыщ итераций будет выполняться медленно.

Про более быстрый метод я уже сказал. Код тут уже привёл _human
Kimel
Я имел ввиду, что мне не подходять "ручные" решения и всякие динамические, курсоры, процедуры и тд.
Этими способами решить задачу нельзя, я не знаю, что и где вы "увидели".
Kimel
А жалко, SQL такой старый язык, а такую банальную функцию не придумали.
Ведь есть же PIVOT и UNPIVOT? А этого нет
Потому что восстановить утерянную информацию невозможно, это же элементарно. Поэтому и нет операции "операцию обратную группировке".

Допустим, мы по картинке выполняем операцию "установить пол". Невозможно по полу "М" или "Ж" восстановить картинку.
Kimel
Glory,

Инструкция языка?
17
29 июн 14, 16:17    [16235469]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
_human
Member

Откуда:
Сообщений: 569
Kimel
Ведь есть же PIVOT и UNPIVOT

BOL
Notice that UNPIVOT is not the exact reverse of PIVOT. PIVOT performs an aggregation and, therefore, merges possible multiple rows into a single row in the output. UNPIVOT does not reproduce the original table-valued expression result because rows have been merged. Besides, null values in the input of UNPIVOT disappear in the output, whereas there may have been original null values in the input before the PIVOT operation.

BOL
29 июн 14, 21:10    [16235971]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
_human,

Ну тогда зачем, в маздай так назвали эти инструкции... Неважно короче. Приходиться использовать костыли.
30 июн 14, 00:58    [16236564]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kimel
Ну тогда зачем, в маздай так назвали эти инструкции..

А зачем вы придумываете определения, понятные только вам
30 июн 14, 01:05    [16236567]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Kimel
Приходиться использовать костыли.
Соберитесь, будьте настойчивей, откажитесь от использования костылей!
30 июн 14, 02:30    [16236608]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Kimel
А жалко, SQL такой старый язык, а такую банальную функцию не придумали.
Ведь есть же PIVOT и UNPIVOT? А этого нет
Странно, что Вы полагаете, будто из известной суммы
можно снова получить те же слагаемые, из которых она была вычислена.
30 июн 14, 09:50    [16236958]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9161
При группировке происходит необратимая потеря информации.
30 июн 14, 10:57    [16237221]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Владислав Колосов,

Как это необратимая (я знаю что такое необратимая)

Вот взять например таблицу
Разгруппировано
Название Цена
Маздай 1
Маздай 2
Маздай 6

Теперь запрос
SELECT [Название], SUM([Цена]) FROM t1 GROUP BY Маздай

Название Цена
Маздай 9

Те, что просуммированны невозможно возвратить, НО я же могу сам понимать, что мне нужно разгруппировать по ОДНОМУ. То есть что-то типа UNGROUP([Цена],1)
И тогда будет
Название Цена
Маздай 1
Маздай 1
Маздай 1
Маздай 1
Маздай 1
Маздай 1
Маздай 1
Маздай 1
Маздай 1

При UNGROUP([Цена],3) будет
Название Цена
Маздай 3
Маздай 3
Маздай 3

Неужели такую функцию тоже нельзя сделать? Выбрать по сколько разбить.
30 июн 14, 11:10    [16237283]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kimel
НО я же могу сам понимать, что мне нужно разгруппировать по ОДНОМУ.

Это называется не "разгруппировать". Это называется сгенерировать новые записи.

Kimel
Неужели такую функцию тоже нельзя сделать?

Вы первый, кому она нужна. Можете написать в поддержку, чтобы рассмотрели возможность такого функционала в следующих версиях
30 июн 14, 11:13    [16237299]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Kimel
Неужели такую функцию тоже нельзя сделать? Выбрать по сколько разбить
Если не по 1, то задача неоднозначна.
Как же сервер будет возвращать один определённый результат?
30 июн 14, 11:14    [16237303]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kimel
При UNGROUP([Цена],3) будет
Название Цена
Маздай 3
Маздай 3
Маздай 3

Неужели такую функцию тоже нельзя сделать? Выбрать по сколько разбить.

А при UNGROUP([Цена],4) что будет ?
30 июн 14, 11:15    [16237309]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Логично предположить, что в этой функции должно быть что-то типа
UNGROUP([Цена],4,1) Где последний параметр означает TRUE FALSE, то есть считать с остатком и без. То есть при тру, получиться так:


Название Цена
Маздай 4
Маздай 4
Маздай 1

А при FALSE так
Название Цена
Маздай 4
Маздай 4

Можно ещё это сделать подругому, не TRUE FALSE, 0,1,2
Где 0 это считать с остатком, 1 без остатка, 2 это выдвать ошибку если нельзя сделать без остатка. И сделать режим 2 стандартным, то есть что ыб если не задано, то ошибку давало.

Как в EXCELe 1000 ненужных функций, так они могут, а здесь функцию РАЗБИЕНИЯ сделать не могут.
30 июн 14, 11:31    [16237426]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kimel
Как в EXCELe 1000 ненужных функций, так они могут, а здесь функцию РАЗБИЕНИЯ сделать не могут.

Зачем делать то, чем никто не пользуется ?
30 июн 14, 11:32    [16237443]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Я бы пользовался и вообще в интернете многие спрашивают, как это сделать, маздаю всёравно.
30 июн 14, 11:33    [16237454]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kimel
Glory,

Я бы пользовался и вообще в интернете многие спрашивают, как это сделать, маздаю всёравно.
https://connect.microsoft.com/

Зачем здесь эти разговоры в пользу бедных?
30 июн 14, 11:36    [16237484]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Они бы могли хотя бы дать совет, как эту вещь лучше всего организовать. А то в Интернете 1000 реализаций и что все проверять?
30 июн 14, 11:36    [16237487]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать операцию обратную группировке  [new]
_human
Member

Откуда:
Сообщений: 569
а как-то можно писать свои ф-ии. уверен на форуме знают как. выдайте ТС-у напильник.
30 июн 14, 11:36    [16237488]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить