【问题标题】:Duplicate a Row Based on a Condition SQL根据条件 SQL 复制行
【发布时间】:2018-07-11 11:33:56
【问题描述】:

我有一张像这样的表

+-------+------+------+----------+ 
| Index |  F1  |  F2  | Multiply | 
+-------+------+------+----------+
|  0    |  LG  |  SC  |     1    |
|  1    |  WE  |  CC  |     1    |
|  2    |  TY  |  PL  |     2    |
+-------+------+------+----------+

我想将“乘”列乘以 2 以确定要添加到结果中的行数。对于上面的示例,我希望我的 SQL 查询返回:

+------+-----+-----+
|Index | F1  | F2  |
+------+-----+-----+
|  0   |  LG | SC  | 
|  0   |  LG | SC  |
|  1   |  WE | CC  |
|  1   |  WE | CC  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
+------+-----+-----+

我没有太多编写 SQL 查询的经验,因此非常感谢您的帮助。

【问题讨论】:

  • 因为 2 x 1 = 2?

标签: sql sql-server database database-table


【解决方案1】:

试试这个

with myTable as (
    select * from (values 
        (0,'LG','SC',1)
        ,(1,'WE','CC',1)
        ,(2,'TY','PL',2)
    ) t ([Index], F1, F2, Mutiply)
)
select
    [Index], F1, F2
from
    myTable m
    join master.dbo.spt_values v on m.Mutiply * 2 > v.number
where
    Type = 'P'

编辑:添加一些描述

通过编写类似的查询

select * from table 
cross join (values (1),(2)) t(n)

我们可以将表格中的行加倍。而cross join (values (1),(2),(3),(4)) t(n) 将使行数翻两番。在这种情况下,行乘法将取决于列Multiply。所以我们需要乘以Multiply 列的 2 值并与具有数字序列 (0,1,2,3,4,5,6,7...) 的表连接,其中数字小于计算值。例如,对于Multiply = 2,连接条件将是 4 个小于 2*2 的数字(0、1、2、3)。而这 4 个数字将使初始行增加四倍。

master.dbo.spt_values 仅用于获取数字序列。序列可以在运行时生成,也可以使用另一个带有数字序列的表

【讨论】:

  • 您能否对此答案添加一些解释。会有很大帮助的。
  • 尽我所能添加描述:) 让我知道是否可以理解
  • @uzi 完美 :)
  • 非常好.. 但是你为什么要保留条件> v.number .ddn't get here
【解决方案2】:

另一种方法是使用递归CTE:

;WITH cte AS (
    SELECT *
    FROM (VALUES
    (0, 'LG', 'SC', 1),
    (1, 'WE', 'CC', 1),
    (2, 'TY', 'PL', 2)
    ) as t([Index], F1, F2, Multiply)
), final AS (
    SELECT  [Index], 
            F1, 
            F2, 
            Multiply*2 as Multiply 
    FROM cte  -- At first we get basic recordset with x2 in Multiply
    UNION ALL 
    SELECT  [Index], 
            F1, 
            F2, 
            Multiply-1
    FROM final  -- On each iteration we select columns we need and
    WHERE Multiply-1 > 0   -- use Multiply as counter
)

SELECT  [Index], 
        F1, 
        F2
FROM final
ORDER by [Index]

输出:

Index       F1   F2
----------- ---- ----
0           LG   SC
0           LG   SC
1           WE   CC
1           WE   CC
2           TY   PL
2           TY   PL
2           TY   PL
2           TY   PL

(8 rows affected)

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2020-10-20
    • 2016-05-30
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多