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

マージ時に必要なルールは何ですか?

  • 「テキストフィールド」は連結されているだけです(例:オルガン+ピアノ==>「オルガンピアノ」)

  • 「ブール値フィールド」は、論理 OR (例: 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 に答える