Вставка x строк на основе значения столбца - PullRequest
0 голосов
/ 10 января 2019

Я осмотрелся и увидел несколько примеров, но ни один из них не соответствует моим потребностям.

У меня есть таблица:

+-------+-----------+-----------+
| Year  |   Month   |   Count   |     
+-------+-----------+-----------+
| 2001  |    Nov    |    2      |   
| 2001  |    Dec    |    1      |   
| 2002  |    Jan    |    3      |  
+-------+-----------+-----------+

Теперь идея в том, что я хочу вставить значения года и месяца x раз в другую таблицу на основе значения счетчика. Поэтому я должен получить что-то вроде следующего:

+-------+-----------+
| Year  |   Month   |    
+-------+-----------+
| 2001  |    Nov    |   
| 2001  |    Nov    |  
| 2001  |    Dec    |   
| 2002  |    Jan    |   
| 2002  |    Jan    | 
| 2002  |    Jan    |  
+-------+-----------+

Это всего лишь небольшая выборка, фактическая таблица намного больше.

Любые указатели на это были бы великолепны. Я надеюсь, что то, что я спрашиваю, имеет смысл, любые вопросы, пожалуйста, задавайте:)

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы также можете использовать рекурсивный cte как

WITH CTE AS
(
  SELECT *
  FROM T
  UNION ALL
  SELECT [Year], [Month], [Count] -1
  FROM CTE
  WHERE [Count]-1 > 0
)
SELECT T.*
FROM T LEFT JOIN CTE
       ON T.Year = CTE.Year
          AND
          T.Month = CTE.Month
0 голосов
/ 10 января 2019

Используя идею таблицы подсчета, вы можете сделать это довольно легко. Вот пример с вашими данными.

declare @Something table 
(
    MyYear int
    , MyMonth char(3)
    , MyCount int
)
;

insert @Something values
(2001, 'Nov', 2)   
,(2001, 'Dec', 1)   
,(2002, 'Jan', 3)  
;

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E1
    )

insert YourOtherTable
(
    YourYear
    , YourMonth
)
select s.MyYear
    , s.MyMonth
from @Something s
join cteTally t on t.N <= s.MyCount
...