将行值扩展到单个行

Posted

技术标签:

【中文标题】将行值扩展到单个行【英文标题】:Expanding row value into induvidual row 【发布时间】:2012-12-19 14:18:50 【问题描述】:

我需要一些有关 SQL 查询的帮助。我知道这应该重新设计,但这是我在更大系统上做的一个小修复:(。

系统有一个名为 sales 的表,其中包含已售出的零件。

id  | date   | idpart
1   |unixtime|   227
2   |unixtime|   256 

等等..

在包含订单内容的 Orderdetails 表中,零件按 id 列出,以及客户订购的唯一零件的数量。

id |idpart | amount
1  | 255   | 4
2  | 265   | 2

现在,我的问题是我必须运行查询来填充销售表,但将 idpart 添加为新行,该部分按顺序与数量值相同。 我需要的结果是:

id  | date   | idpart
1   |unixtime|   227
2   |unixtime|   256 

3   |unixtime|   255
4   |unixtime|   255
5   |unixtime|   255
6   |unixtime|   255
7   |unixtime|   265
8   |unixtime|   265

有没有人可以帮我解决这个问题?

【问题讨论】:

他们需要在销售表中单独列出每个部分。系统是这样设计的,一些在销售之上运行的报表必须有这种风格的数据。 :( 你不能从应用程序中做复制逻辑吗? 我还没有访问应用程序的那部分。早些时候,他们在销售表中也有金额列。但是,由于某种原因,他们删除了它,现在它停止工作了。谁会相信! 我会说说服处理应用程序逻辑的团队来处理它,从应用程序开始会更容易和更快。 是的,我同意你的看法。问题是这可能需要数周时间。我只需要为分析师生成销售表。现在我在 Orderdetails 中有 60K 行需要填充到销售中 :( 这种 SQL 不是我的强项,所以我非常感谢您了解如何解决它... 【参考方案1】:

如果您有一个带有数字的表格,这很容易。你可以这样做:

select id, date, idpart
from sales
union all
select id, date, idpart
from orders o cross
     numbers n
     on n.number <= o.amount

这是假设 date 来自订单表。

现在,您只需要生成数字表。这是 mysql 的一个痛点。也许您有另一个可以使用的表,例如日历表。否则,您可以通过插入具有自动增量列的表来创建一个。

在其他数据库中,您可以使用row_number() 函数即时创建这样的表。但是 MySQL 不支持这个。

【讨论】:

感谢您的回答。不幸的是,订单表中不存在日期:(据我所知,UNION 运算符要求在用于 UNION 的表上设置的列相同..

以上是关于将行值扩展到单个行的主要内容,如果未能解决你的问题,请参考以下文章

将行值反透视到多列

将行值转换为火花数据框中的列数组

在oracle中将行值添加到列

根据匹配的列标签将行值添加到数据框

使用 Python pandas 根据条件将行值复制到另一列

使用 select 将行添加到查询结果