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”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagpostgresql
, 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 按条件分组行的主要内容,如果未能解决你的问题,请参考以下文章