SQL中的Coalesce和Pivot

时间:2009-04-07 16:16:19

标签: sql sql-server-2005 tsql aggregate

我无法弄清楚如何合并或转向如下所示的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

您需要的不是数据透视查询,而是具有group by和聚合字符串连接功能的简单选择。但我不记得tsql中的确切功能。

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

答案 3 :(得分:-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]