【问题标题】:Split a row into multiple rows based on a column value SQL根据列值 SQL 将一行拆分为多行
【发布时间】:2016-04-10 15:53:06
【问题描述】:

我有以下“订单表”:

    Item        Quantity
    pencil      2
    pen         1
    Notebook    4

我需要这样的结果:

  Item        Quantity
  pencil      1
  pencil      1
  pen         1
  Notebook    1
  Notebook    1
  Notebook    1
  Notebook    1

【问题讨论】:

  • 您想要交叉连接:请参阅此问题/答案:stackoverflow.com/questions/4481396/…
  • 什么数据库平台? SQL 服务器; MySQL?
  • sql server.. 基本上我希望该项目重复的次数作为最初订购的数量,并且数量在每个项目的最终输出中显示为 1
  • @Surbhit 为什么在输出中有一个数量,如果它总是为 1?只需显示从数据库中读取的数量。这将使您的输出更易于阅读,代码更易于维护。

标签: sql sql-server-2012


【解决方案1】:

您可以使用公共表表达式的递归查询,根据数量字段生成重复行数,如下所示

WITH cte (sno,item,quantity,rnum)
AS
(
    SELECT sno,item,quantity, 1 as rnum
    FROM [Order]

    UNION ALL

    SELECT cte.sno,cte.item,cte.quantity, rnum+1
    FROM [Order] JOIN cte ON [Order].sno = cte.sno
    AND cte.rnum < [Order].quantity
)
SELECT item,1 AS Quantity 
FROM cte 
ORDER BY sno

【讨论】:

    【解决方案2】:

    您没有指定您使用的是哪个 RDBMS,因此生成数字的方式将取决于此(可能是 SQL Server 的递归 CTE,Oracle 使用 DUAL 等)。我只编写了代码来处理您显示的数据,但您显然需要在最终解决方案中考虑大于 4 的数字。

    SELECT
        MT.sr_no,
        MT.item_name,
        1 AS quantity
    FROM
        My_Table MT
    INNER JOIN
        (
            SELECT 1 AS nbr UNION ALL SELECT 2 AS nbr UNION ALL
            SELECT 3 AS nbr UNION ALL SELECT 4 AS nbr
        ) N ON N.nbr <= MT.quantity
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2020-02-10
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多