2012-10-25 27 views
2

我有4条记录的表:合并记录与SQL,有一些规则

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 

什么合并时我想要的规则?

  • “文本字段” 只是级联(例如:器官+钢琴==> “器官钢琴”)

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

我的问题:

1)我会选择在关于使用要做到这一点的能力的软件!数据库与SQL查询(SQLite,MySQL甚至Access)或Excel?

2)如果最好的解决方案是数据库,那么SQL查询是做什么的?

非常感谢!

+0

我试图Excel的重复删除工具,但它没有强大到足以做到这一点... – Basj

+0

*** *** SQL仅仅是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品...更高级的功能是特定于供应商的 - 因此我们真的需要知道您的数据库系统**(以及哪个版本)使用.... –

回答

2

我choes和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

1

使用SQL Server 2005或更高,下面是一组T-SQL语句,将说明以上(使用交​​叉的COMBOX应用和case语句)的例子:

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) 
+0

非常感谢,我会测试这个。 删除重复记录的函数在哪里? 您是否认为可以通过删除重复记录来解决问题? – Basj

+0

好吧,现在认识到这实际上并没有删除任何东西,它只是把它滚动到你以前的输出。这里的前提是名称为Bob的两条记录确实不重复。它们具有相同的'Bob'的名称值,但是每条记录存储不同的数据(一个带有一个器官,另一个带有小提琴)。如果您想将这些记录合并为一个,那么需要进行额外的处理,并且我会质疑您的用户究竟在尝试完成哪些操作? –