2009-04-07 62 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 2009-04-07 16:21:31

+0

你能说出为什么三个不同但相关的东西(名字,姓氏,公司)位于不同行的同一列中吗?或者它只是一个选择不好的例子? – Tomalak 2009-04-07 16:33:42

回答

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 
0

你需要什么不是枢轴式查询,而是一个简单的选择与分组依据和聚合字符串连接功能。但我不记得tsql中的确切函数。

更新:在tsql中没有聚合级联函数,但自从sql2005开始,你可以编写自己的扩展来实现这样的功能。谷歌搜索有很多例子:tsql 2005 concatenation集合示例。

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每个_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 
-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]