2

我有一张有 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 查询是什么?

提前非常感谢!

4

2 回答 2

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上的示例

于 2012-10-26T06:56:47.660 回答
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)
于 2012-10-25T22:33:12.813 回答