SQLでCOALESCEとピボット
-
05-09-2019 - |
質問
私はこのようになりますSQLレコードのトラブル合体する方法を考え出すまたはピボットを持っています:
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
任意の提案に感謝をし、助けて!
解決
私が行って何
これはですが、私はそれはあなたのために合う願っています。
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
他のヒント
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)
あなたは常に各ID
ための3つのハードコードさ_group
年代のセットを持っている場合は、あなただけ使用することができます:
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
あなたが必要なものは、クエリを旋回したが、GROUP BYおよび集計文字列の連結機能を備えたシンプルな選択されていません。しかし、私はTSQLでの正確な機能を覚えていない。
更新:そこTSQLには集計連結機能はありませんが、SQL2005ので、あなたがそのような機能を実装するために独自の拡張機能を記述することができます。以下のためのGoogle検索の例がたくさんあります:TSQL 2005連結集計例
。これは少し陳腐ですが、私はそれは小さなデータセットのために合理的にうまく動作するはずだと思います。あなたが大量のデータを持っている場合は、カーソルとループを作成する必要があります。
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]
所属していません StackOverflow