SQL 按条件分组行

Posted

技术标签:

【中文标题】SQL 按条件分组行【英文标题】:SQL group rows by condition 【发布时间】:2019-10-16 10:24:40 【问题描述】:

我需要在以下条件下将 3 行合并为一行 - 如果任何列中至少存在一个 J,那么所有列都应该用 J 覆盖。如果有所有 N,我应该得到一个包含所有 N 的行。

我在想类似的东西 -

SELECT BRGNR
, AFTLST
,CASE WHEN EGMK IN ('J','N') THEN 'J' ELSE EGMK END EGMK
,CASE WHEN TDMK IN ('J','N') THEN 'J' ELSE TDMK END TDMK
,CASE WHEN UDMK IN ('J','N') THEN 'J' ELSE UDMK END UDMK
, CASE WHEN FUMK IN ('J','N') THEN 'J' ELSE FUMK END FUMK
  FROM IF.TIF_BRUGER_BT  
GROUP BY BRGNR

但问题是在那种情况下,当我拥有所有 N 时,所有值都会被覆盖到 J,如果所有值都是 N,我需要拥有 N

【问题讨论】:

您能否发布您的示例数据集和预期输出。 我们很高兴您在这里,我们需要查看您的代码以便我们提供帮助。 样本数据最好显示为formatted text。请参阅here,了解有关如何创建漂亮表格的一些提示。您应该提供输入数据(我猜这是屏幕截图)和该输入的预期输出。请点击下方的edit 链接edit您的问题。 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag postgresql, oracle, sql-server, db2, ... 【参考方案1】:

我将这个问题解释为:

如果列中有'J',则结果为'J'。 否则,如果都是'N',则结果为'N'

我假设唯一的值是'J''N'。我的猜测是 'J' --> "yes" 和 'N' --> "no",如果任何值为 "yes",你想要 "yes"。

如果是这样,您可以使用MIN()

SELECT BRGNR, AFTLST,
       MIN(EGMK), MIN(TDMK), MIN(UDMK), MIN(FUMK)
FROM IF.TIF_BRUGER_BT  
GROUP BY BRGNR, AFTLST

【讨论】:

@MarijaPotapova:如果此答案正确回答了您的问题,请点击绿色复选标志考虑accepting it。

以上是关于SQL 按条件分组行的主要内容,如果未能解决你的问题,请参考以下文章

sql多条件分组查询,求sql语句。

如何在单个 SQL 查询中使用多个计数和按条件分组

如何根据条件对sql中的行进行分组

按DAY,MONTH,YEAR分组时sql缺少行

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

仅在某些条件下使用 Redshift 中的 SQL 对具有相同名称的行进行分组