2

次のような 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  

提案と助けをありがとう!

4

4 に答える 4

2

これは私がやったことです、私はそれがあなたに合うことを願っています

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
于 2009-04-07T16:32:30.500 に答える
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)

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
于 2009-04-07T16:36:56.107 に答える
0

必要なのは、ピボットされたクエリではなく、group by と集計文字列連結関数を使用した単純な選択です。しかし、tsql の正確な機能を覚えていません。

更新: tsql には集約連結関数はありませんが、sql2005 以降、独自の拡張機能を記述してそのような関数を実装できます。グーグル検索にはたくさんの例があります: tsql 2005 concatenation aggregate example.

于 2009-04-07T16:29:28.447 に答える
-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]
于 2009-04-07T16:47:02.617 に答える