【问题标题】:Consolidating Duplicate Rows into 1 Row with Multiple Columns将重复的行合并为具有多列的 1 行
【发布时间】:2016-04-04 22:05:45
【问题描述】:

我想知道如何获取如下所示的数据集:

表 1:

RecordID    Code
A   351
A   352
A   353
A   354

看起来像这样:

表 2:

您已经可以假设我创建了第二个表,其中包含我在下面创建的列标题

RecordID    351 352 353 354 355 356
   A         Y   Y   Y   Y   N   N

提前感谢您的帮助。

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 我使用的是 SQLServer 2012

标签: sql merge sql-server-2012 duplicates


【解决方案1】:
SELECT RecordID,
    CASE WHEN SUM(CASE WHEN Code = 351 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [351],
    CASE WHEN SUM(CASE WHEN Code = 352 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [352],
    CASE WHEN SUM(CASE WHEN Code = 353 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [353],
    CASE WHEN SUM(CASE WHEN Code = 354 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [354],
    CASE WHEN SUM(CASE WHEN Code = 355 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [355],
    CASE WHEN SUM(CASE WHEN Code = 356 THEN 1 ELSE 0 END) = 1 THEN 'Y' ELSE 'N' AS [356]
FROM yourTable
GROUP BY RecordID

【讨论】:

  • 谢谢大家!这是有道理的,应该可以工作,我试一试。
【解决方案2】:

你可以试试这样的:

select
    RecordID,
    iif(sum(iif([Code]=351,1,0))>0,'Y','N'),
    iif(sum(iif([Code]=352,1,0))>0,'Y','N'),
    iif(sum(iif([Code]=353,1,0))>0,'Y','N'),
    iif(sum(iif([Code]=354,1,0))>0,'Y','N'),
    iif(sum(iif([Code]=355,1,0))>0,'Y','N'),
    iif(sum(iif([Code]=356,1,0))>0,'Y','N')
from table
group by RecordID

【讨论】:

  • 这是一种有趣的方式。为什么不直接使用max(case when code = 351 then 'Y' else 'N' end)
  • @Lock 这种情况下我们会依赖ascii码的顺序,如果需要本地化或者使用其他符号怎么办?
  • @Lashlane。不确定我看到本地化与此有什么关系?不要误会我的意思。我并不是说你的错了。只是从来没有见过这样的事情,对我来说意图并不那么清楚。你能解释一下这如何影响 ascii 代码的顺序吗?
  • @Lock 您的方法仅适用于 Y > N 的 ascii 代码,例如在俄语中反之亦然(Д(是)
  • @Lashlane 啊,我明白你现在的意思了。我没有完全理解这个问题!
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2017-06-21
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2018-01-11
  • 2019-09-25
  • 2018-08-14
相关资源
最近更新 更多