【问题标题】:Merging similar SQL rows合并相似的 SQL 行
【发布时间】:2019-01-10 10:44:30
【问题描述】:

我想在 SQL 中合并某些 IF 条件的行。我的数据库是这样的

| com_id | bom_id |fil_title ====================== | 6067 | 6070 |空 | 6067 | 6070 |07 | 6067 | 6071 |空 | 6067 | 6071 |07 | 6067 | 6069 |空

我想要达到的是

| com_id | bom_id |fil_title ====================== | 6067 | 6070 |07 | 6067 | 6071 |07 | 6067 | 6069 |空

所以每次如果我有两行具有相同的 bom_id 我想将它们合并为一个,但如果我有一个就离开它。

这只是一个示例 - 我的完整查询更大,但问题就在那里。我知道 SQL 有一些 IF,但我真的不知道如何在这里使用它。

//编辑 我没有准确提到我有更多带有一些随机值的字段。我只想从不为空的行中选择这个值。 (但前提是我们有 2 行)。这就是为什么不同的和简单的聚合不起作用的原因

【问题讨论】:

  • “这就是为什么 [...] 简单地 agrregate 不起作用”:我不明白 Yogesh Sharma 的答案对你不起作用。如果有更多类似fil_title 的列,则将它们视为相同的select com_id, bom_id, max(fil_title), max(another_column), max(yet_another_column) ...
  • 我不能取最大值(另一列),因为它不一定是最大值。有时是最大值有时是最小值。无法澄清。这就是我想从特定行中选择值的原因。
  • 哪一行?到目前为止,您只展示了一行有值而另一行没有值的情况。所以使用MAXMIN 来获取那个值并不重要。如果不是从所有其他值都为 NULL 的值列表中选择一个值,那么您会突然问一个非常不同的问题。您可能希望在此处接受答案并使用新问题和更全面的示例数据(包括边缘案例)打开新请求。

标签: mysql sql if-statement merge


【解决方案1】:

只做聚合

select com_id, bom_id, max(fil_title)
from table t
group by com_id, bom_id;

如果该示例结果来自其他查询,则使用 subquery 代替:

select com_id, bom_id, max(fil_title)
from ( <query here>
     ) t
group by com_id, bom_id;

【讨论】:

  • 如果我进行聚合,则另一个字段有问题 列 'tew_component.com_tag' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
  • @Toriam 。 . .这回答了您提出的问题 - 您的问题没有名为 com_tag 的列。我建议您接受这个答案并提出另一个问题。如果您更改问题,您将使人们给您的答案无效,这可能会导致投反对票。
【解决方案2】:

或者你可以使用 distinct 这样做

select com_id , bom_id , max(fil_title)
from table t
group by com_id , bom_id

【讨论】:

  • 我已经使用 distinct,但有些字段不同。
  • 从您的查询中删除 DISTINCT。这是多余的。当您的分组依据在您的选择列表中时,您无法获得重复的行。 (并且DISTINCT 不是一个函数。括号只会给查询的(人类)读者造成混淆;它们一开始就不应该存在。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多