【问题标题】:Inserting x rows based off a column value根据列值插入 x 行
【发布时间】:2019-01-10 14:42:12
【问题描述】:

我查看并看到了一些示例,但没有一个适合我的需要。

我有一张桌子:

+-------+-----------+-----------+
| 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    |  
+-------+-----------+

这只是一个小样本,实际表格要大得多。

对此的任何指示都会很棒。 我希望我的问题是有道理的,任何问题,请问:)

【问题讨论】:

标签: sql sql-server sql-insert


【解决方案1】:

你也可以使用递归 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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多