Member 13684763 Ответов: 2

Как мне найти нижеприведенную колонку ?


Таблица1

имя игрока повторить
1 Сачин 3
2 Гангулы 2
3 Дравид 4

Рассмотрим приведенную выше таблицу.Теперь мне нужно создать новую таблицу со следующим выводом:

имя игрока повторить
1 Сачин 1
1 Сачин 1
1 Сачин 1
2 Гангулы 1
2 Гангулы 1
3 Дравид 1
3 Дравид 1
3 Дравид 1
3 Дравид 1

Здесь, в Таблице 1 ,если повтор равен 3, то во второй таблице повтор будет 3 раза со значением 1.

Пожалуйста, помогите с решением.

Спасибо

Что я уже пробовал:

Я пробовал ранг ,плотный куб ранга и т. д., Но никакого reslult

Naga Sindhura

попробуйте использовать вспомогательную таблицу table, упомянутую в следующей ссылке.
https://stackoverflow.com/questions/33327837/repeat-rows-n-times-according-to-column-value

Naga Sindhura

еще одна вещь master.dbo.spt_values таблица для повторения столбцов в течение n раз

Создание повторов таблиц (
Id int identity(1,1),
RepeatText varchar(100),
Repeatcount ни инт
)
Вставить в RepeatRows выберите "повторить 3 раза", 3
Вставить в RepeatRows выберите "повторить 2 раза", 2
Вставить в RepeatRows выберите "повторить 4 раза", 4
Вставить в RepeatRows выберите "только один раз", 1

Выберите t1.*, t2.number + 1 RepeatNumber
Из повтора Т1
Присоединяйтесь к master.dbo.spt_values t2 на t2.type = 'P' и t2.number < t1.RepeatCount

2 Ответов

Рейтинг:
0

CHill60

Вы можете использовать перекрестное применение с таблицей чисел. В этой статье показан один из способов создания таблицы чисел Генерация последовательности в SQL[^] или более подробно здесь Таблица чисел SQL Server, объясненная - Часть 1[^]
Тогда вы можете сделать что-то вроде этого

create table #src (id int identity(1,1), player varchar(20), [repeat] int)
insert into #src (player, [repeat]) values
('Sachin', 3),
('Ganguly', 2),
('Dravid', 4)

declare @m int = (SELECT Max([repeat]) from #src)

;WITH q AS
(
    SELECT  1 AS num
    UNION ALL
    SELECT  num + 1
    FROM    q
    WHERE num < @m
    )
SELECT num INTO #nos FROM q

SELECT A.*
FROM #src A
CROSS APPLY #nos B 
WHERE B.num <= A.[repeat]
ORDER BY id
Приведем следующие результаты:
1	Sachin	3
1	Sachin	3
1	Sachin	3
2	Ganguly	2
2	Ganguly	2
3	Dravid	4
3	Dravid	4
3	Dravid	4
3	Dravid	4
[EDIT] просто перечитайте мое решение против вашего поста-вы, вероятно, хотите, чтобы этот последний выбор был
SELECT A.id, A.player, 1 as [repeat]
чтобы получить точные результаты, о которых вы упомянули


Maciej Los

Вот это да! Я думаю, что этого можно достичь более простым способом ;) Смотрите мое решение.

Рейтинг:
0

Maciej Los

В дополнение к решению 1 by CHill60[^], я бы предпочел использовать только общие табличные выражения (без использования перекрестного применения). Например:

<pre>DECLARE @tmp TABLE(id INT IDENTITY(1,1), player VARCHAR(30), [repeat] INT)

INSERT INTO @tmp(player, [repeat])
VALUES('Sachin', 3),
('Ganguly', 2),
('Dravid', 4)

;WITH CTE AS 
(
    --initial part
    SELECT id, player, 1 As CurrVal, [repeat], 1 AS myCounter
    FROM @tmp
    WHERE [repeat]>0
    --recursive part
    UNION ALL
    --myCounter is used to define the condition to exit from loop
    SELECT id, player, 1 As CurrVal, [repeat], myCounter + 1 AS myCounter
	FROM CTE
	WHERE myCounter<[repeat]
)
SELECT id, player, CurrVal AS [repeat]
FROM CTE
ORDER BY id, myCounter   



Результат:
id	player	repeat
1	Sachin	1
1	Sachin	1
1	Sachin	1
2	Ganguly	1
2	Ganguly	1
3	Dravid	1
3	Dravid	1
3	Dravid	1
3	Dravid	1


Для получения более подробной информации, пожалуйста, смотрите:
Использование Общих Табличных Выражений[^]
С common_table_expression (Transact-SQL) | Microsoft Docs[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]