2009-04-07 13 views
2

私はこのようになりますSQLレコードに合体する方法を考え出すまたはピボットトラブルを抱えています中:合体とピボットTSQL

ID  VALUE  GROUP 
3  John  18 
4  Smith  18 
5  Microsoft 18 
3  Randy  21 
4  Davis  21 
5  IBM  21 
etc 

と私はのためにこの

NEWVALUE    GROUP 
Smith, John (Microsft)  18 
Davis, Randy (IBM)   21 

おかげのようにフォーマットしたいです任意の提案と助け!

+0

どのようなSQL環境を使用していますか?標準SQLはこれを行うことはできませんが、問題を解決するために多くの独自の方法が存在します。 – Tomalak

+0

3つの異なるが関連するもの(名、姓、会社)が別々の行で同じ列に存在する理由を教えてください。あるいはそれはちょうどひどく選ばれた例ですか? – Tomalak

答えて

2

これは、私はそれはあなたが常に各_groupための3つのハードコーディングさID年代のセットを持っている場合は、あなただけ使用することができます

DECLARE @t table (id int, value VARCHAR(20), grupo int) 
INSERT @T VALUES (3, 'John', 18) 
INSERT @T VALUES (4, 'Smith', 18) 
INSERT @T VALUES (5, 'Microsoft', 18) 
INSERT @T VALUES (3, 'Randy', 21) 
INSERT @T VALUES (4, 'Davis', 21) 
INSERT @T VALUES (5, 'IBM', 21) 


SELECT grupo, (SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 4) + ', ' + 
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 3) + ' (' + 
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 5) + ')' 
FROM @t t 
GROUP BY grupo 
+0

これを実行すると、次のようになります。キーワード 'BY'の近くに構文が正しくありません。 –

+0

すべてのテキストを選択していることを確認してください。「group by grupo」行 –

+0

OK、WEird、ブラウザーからのコピー貼り付けはFROM @t tGROUP BY grupoです。私はそれが他人のために起こるかもしれないので、これだけを言います! –

0

必要なものは、ピボットクエリーではなく、group byと集約文字列連結機能を持つ単純な選択です。しかし、私はtsqlの正確な機能を覚えていません。

更新:tsqlに集約連結機能はありませんが、sql2005以降、独自の拡張機能を作成してそのような機能を実装することができます。 Google検索にはたくさんの例があります:tsql 2005連結集約の例。

1
SELECT LEFT(gvalue, LEN(gvalue) - 1) AS newvalue, _group 
FROM (
     SELECT DISTINCT _group 
     FROM mytable 
     ) qo 
CROSS APPLY 
     (
     SELECT value + ', ' 
     FROM mytable qi 
     WHERE qi._group = qo._group 
     FOR XML PATH ('') 
     ) gr(qvalue) 

のために適合願って、私が行っです:

SELECT m3._group, m3.value + ', ' + m4.value + '(' + m5.value + ')' AS newvalue 
FROM mytable m3 
LEFT JOIN 
     mytable m4 
ON  m4._group = m3.group 
LEFT JOIN 
     mytable m5 
ON  m5._group = m3.group 
WHERE m3.id = 3 
     AND m4.id = 4 
     AND m5.id = 5 
-1

これはちょっと面倒ですが、小さなデータセットではうまくいくはずです。大量のデータがある場合は、カーソルとループを作成する必要があります。

select max(case when ID = 4 then VALUE else null end) + ', ' + 
    max(case when ID = 4 then VALUE else null end) + '(' + 
    max(case when ID = 5 then VALUE else null end) + ') as NEWVALUE, 
    [GROUP] 
group by [GROUP] 
関連する問題