【问题标题】:Merging records with SQL, with some rules用 SQL 合并记录,有一些规则
【发布时间】:2012-10-16 04:42:04
【问题描述】:

我有一个有 4 条记录的表:

NAME    INSTRUMENT    BOOLEAN 1  BOOLEAN 2
Bob     Organ         TRUE       FALSE
Thomas  Violin        FALSE      FALSE
Bob     Piano         FALSE      TRUE

我想合并具有相同“NAME”的记录,以获得:

Bob     Organ Piano   TRUE       TRUE
Thomas  Violin        FALSE      FALSE

合并时我想要什么规则?

  • “文本字段”只是串联(例如:Organ + Piano ==>“Organ Piano”)

  • “布尔字段”与逻辑或合并(例如:TRUE 或 FALSE = TRUE)

我的问题:

1) 我会根据执行此操作的能力来选择要使用的软件!带有 SQL 查询(SQLite、MySQL 甚至 Access)或 Excel 的数据库?

2) 如果最好的解决方案是数据库,那么执行此操作的 SQL 查询是什么?

提前非常感谢!

【问题讨论】:

  • 我尝试过 Excel 的重复删除工具,但它的功能不够强大...
  • SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...更多高级功能是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统(以及哪个版本)......

标签: sql merge duplicates concatenation


【解决方案1】:

使用 SQL Server 2005 或更高版本,下面是一组 T-SQL 语句,将说明您上面的示例(使用交叉应用和案例语句的组合):

CREATE TABLE [dbo].[COExample](
   [NAME] [varchar](50) NULL,
   [INSTRUMENT] [varchar](50) NULL,
   [BOOLEAN1] [bit] NULL,
   [BOOLEAN2] [bit] NULL
);

INSERT INTO dbo.COExample VALUES('Bob','Organ',1,0);
INSERT INTO dbo.COExample VALUES('Thomas','Violin',0,0);
INSERT INTO dbo.COExample VALUES('Bob','Piano',0,1);

SELECT DISTINCT c.NAME, RTRIM(CombInstruments.combinstruments) AS 'INSTRUMENTS'
,CASE WHEN EXISTS(SELECT * FROM dbo.COExample b1 WHERE b1.NAME = c.NAME AND b1.BOOLEAN1 = 1) THEN 1 ELSE 0 END AS 'BOOLEAN1'
,CASE WHEN EXISTS(SELECT * FROM dbo.COExample b2 WHERE b2.NAME = c.NAME AND b2.BOOLEAN2 = 1) THEN 1 ELSE 0 END AS 'BOOLEAN2'
FROM dbo.COExample c

CROSS APPLY
(
   SELECT ISNULL(c2.INSTRUMENT,'') + ' '
   FROM dbo.COExample c2
   WHERE c2.NAME = c.NAME
   ORDER BY c2.INSTRUMENT FOR XML PATH('')
) CombInstruments(combinstruments)

【讨论】:

  • 非常感谢,我会测试一下。删除重复记录的功能在哪里?你认为有可能有删除重复记录的解决方案吗?
  • 好吧,现在意识到这实际上并没有删除任何东西,它只是将它汇总到您所追求的输出。这里的前提是名称为 Bob 的 2 条记录确实不重复。它们具有相同的名称值“Bob”,但每条记录存储不同的数据(一个带有风琴,另一个带有小提琴)。如果您想将这些记录合并为一个,那将需要额外的处理,我会质疑您想要完成的用户体验到底是什么?
【解决方案2】:

我的选择和 SQLServer2005+

SELECT a.NAME AS NAME,(
SELECT ISNULL(b.INSTRUMENT, '')+ ' '
FROM dbo.COExample b WHERE b.NAME=a.NAME
FOR XML PATH('')) AS INSTRUMENT, MAX(CAST(BOOLEAN1 AS int)) AS BOOLEAN1, MAX(CAST(BOOLEAN2 AS int)) AS BOOLEAN2
FROM dbo.COExample a
GROUP BY a.NAME

SQLFiddle 上的示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2011-07-29
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多