powered by simpleCommunicator - 2.0.31     © 2024 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбить сумму в строке на много строк с значением 1
11 сообщений из 11, страница 1 из 1
Разбить сумму в строке на много строк с значением 1
    #40137487
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
есть строка с данными:

StockID ArticleID Items_sum Price TranDate TranCode market_id
16327743 61000143506 5.000000 8030 13.01.2015 11:18 IN 504

Как мне привести к виду:

StockID ArticleID Items_sum Price TranDate TranCode market_id
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504

То есть разбить сумму пять на 5 строк по 1?
Допускаю что это может что-то похожее на CROSS JOIN, но не получается
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137499
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog,

самое простое while Price > 0
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137500
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog
Добрый день,
есть строка с данными:

StockID ArticleID Items_sum Price TranDate TranCode market_id
16327743 61000143506 5.000000 8030 13.01.2015 11:18 IN 504

Как мне привести к виду:

StockID ArticleID Items_sum Price TranDate TranCode market_id
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504
16327743 61000143506 1.000000 8030 13.01.2015 11:18 IN 504

То есть разбить сумму пять на 5 строк по 1?
Допускаю что это может что-то похожее на CROSS JOIN, но не получается

джойните с таблицей чисел от 1 до .....Х по условию items_sum<X(i) и усё

или cross apply в котором возвращаете результат от 1 до Items_sum
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137525
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Буду пробовать
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137593
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
Select t.n, 1 [NN]
	from (Values (3), (5), (2), (1)) t(n)
	Cross apply (Values(Replicate(',', t.n - 1 ))) tt(m)
	Cross apply string_split(tt.m, ',') ttt
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137598
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uaggster
Код: sql
1.
2.
3.
4.
Select t.n, 1 [NN]
	from (Values (3), (5), (2), (1)) t(n)
	Cross apply (Values(Replicate(',', t.n - 1 ))) tt(m)
	Cross apply string_split(tt.m, ',') ttt


можете, пожалуйста, объяснить код? Как он работает?
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137600
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog
uaggster
Код: sql
1.
2.
3.
4.
Select t.n, 1 [NN]
	from (Values (3), (5), (2), (1)) t(n) --создает 4 строки с цифрами
	Cross apply (Values(Replicate(',', t.n - 1 ))) tt(m) -- для каждой из строк предыдущего шага создается строка вида ',,,,' где кол-во запятых это цифра из той строки минус 1
	Cross apply string_split(tt.m, ',') ttt --для каждой строки из предыдущего шага значение строки содержащей запятые разбивается просто на новое количество строк равное кол-ву запятых в строке плюс 1


можете, пожалуйста, объяснить код? Как он работает?
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137603
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
gerzzog
пропущено...

можете, пожалуйста, объяснить код? Как он работает?

а если сумма в строке будет не пять, а десять, а в следующей строке 15? как автоматически прописать, чтобы разбивало на 10,15 строк по 1?
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137611
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gerzzog

а если сумма в строке будет не пять, а десять, а в следующей строке 15? как автоматически прописать, чтобы разбивало на 10,15 строк по 1?

Ну мне просто лень было описывать исходную таблицу, с полем N, которое в одной строке 10, а в другой - 15 (это по хорошему вы должны были сделать, см. закрепленный топик по правилу оформления тем, на главной странице), и я заменил создание такой таблицы - примера просто выражением Select * from (Values (3), (5), (2), (1)) t(n)
Это для понимания сути происходящего - не важно.
Содержательные строки тут:
Cross apply (Values(Replicate(',', t.n - 1 ))) tt(m)
Cross apply string_split(tt.m, ',') ttt
Собственно, привешиваете это к Select * from ваша_таблица t -- ( а поле n в ней, соответственно, это ваше поле с суммой), и получаете профит.

С т.з. производительности - говно, конечно. MSSQLSERVER очень не хватает постгрессовских генераторов, но, на скорую руку - почему б и нет?
Сердито и не дорого.
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137614
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uaggster
gerzzog

а если сумма в строке будет не пять, а десять, а в следующей строке 15? как автоматически прописать, чтобы разбивало на 10,15 строк по 1?

Ну мне просто лень было описывать исходную таблицу, с полем N, которое в одной строке 10, а в другой - 15 (это по хорошему вы должны были сделать, см. закрепленный топик по правилу оформления тем, на главной странице), и я заменил создание такой таблицы - примера просто выражением Select * from (Values (3), (5), (2), (1)) t(n)
Это для понимания сути происходящего - не важно.
Содержательные строки тут:
Cross apply (Values(Replicate(',', t.n - 1 ))) tt(m)
Cross apply string_split(tt.m, ',') ttt
Собственно, привешиваете это к Select * from ваша_таблица t -- ( а поле n в ней, соответственно, это ваше поле с суммой), и получаете профит.

С т.з. производительности - говно, конечно. MSSQLSERVER очень не хватает постгрессовских генераторов, но, на скорую руку - почему б и нет?
Сердито и не дорого.

понял, спасибо. у меня таблица 10 млн строк, надеюсь съест)
...
Рейтинг: 0 / 0
Разбить сумму в строке на много строк с значением 1
    #40137622
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH MinMax(Mi,Ma) AS (SELECT MIN(Items_sum),MAX(Items_sum))
,Numbers(N) AS
(
 SELECT Mi FROM MinMax
 UNION ALL
 SELECT Num.N+1 FROM Numbers Num JOIN MinMax MM ON Num.N<MM.Ma
)
SELECT t.StockID, t.ArticleID, Items_sum=Num.N, t.Price, t.TranDate, t.TranCode, t.market_id
FROM t JOIN Num ON t.Items_sum>=Num.N;

Не проверял!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбить сумму в строке на много строк с значением 1
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]