根据列值插入x行

时间:2019-01-10 14:42:12

标签: sql sql-server sql-insert

我看了看一些示例,但没有一个适合我的需求。

我有一张桌子:

+-------+-----------+-----------+
| 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 :(得分:2)

使用提示表的想法,您可以轻松地做到这一点。这是您的数据示例。

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

答案 1 :(得分:2)

您还可以将递归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