编写涉及聚合函数的SQL查询

时间:2012-09-21 17:34:21

标签: sql sql-server-2008

我在组合多个表后在我的数据库中创建了以下视图。 select * from MYViEW会在下面给出以下结果。

ProductID | TechID | ContactID | Priority | FIRSTNAME | MIDDLEINI | LASTNAME | 
1123         2406       1371        1        Pradeep       X          Nayak      
1123         2406       1368        2        Hello         W          World      
1123         2406       1363        3        Foo           Y          World    
1299         2279       1208        2        Some          Z          Dude     

我需要显示下面的OUTPUT结果:

ProductID | TechID | ContactID | Priority | FIRSTNAME | MIDDLEINI | LASTNAME | Buyers                                        |
1123         2406       1371        1        Pradeep    X           Nayak      Nayak, Pradeep X; World, Hello W; World, Foo Y  
1299       2279         1208        2        Some       Z           Dude       Dude, Some Z

对于每个产品ID和技术ID都有一条记录,并且所有买方必须以LastName, FirstName MiddleIni格式组合在一列中,并且每个名称用空格分隔。我已经尝试使用here中的自定义聚合函数将结果合并到单个列中。如果您能帮我查询,请告诉我。

3 个答案:

答案 0 :(得分:3)

这将以您想要的方式显示数据:

select t1.ProductID,
  TechId,
  x.ContactID,
  x.Priority,
  FirstName,
  MiddleIni,
  LastName,
  stuff((select  '; ' + lastname + ', ' + FIRSTNAME + ' ' + MIDDLEINI
          from yourtable t2
          where t2.productid = t1.productid
        FOR XML PATH('')), 1, 1, '') 
from yourtable t1
inner join
(
  select min(priority) priority, ProductID, max(ContactID) ContactID
  from yourtable
  group by ProductID
) x
  on t1.ProductID = x.ProductID
  and t1.contactid = x.contactid

请参阅SQL Fiddle with Demo

这是获得MIN()优先级值 - 最高 - 然后是MAX() contactId

答案 1 :(得分:1)

好的,这是一个很好的问题,我见过的最佳答案是here。我建议您根据需要使用XML PATH选项,它看起来像这样:

SELECT v.ProductID, v.TechID, v.ContactID, MIN(v.Priority) AS Priority,
    STUFF ( ( SELECT '; ' + bv.LastName + ', ' bv.FirstName + ' ' + bv.MiddleIni
              FROM [MYVIEW] bv
              WHERE bv.ProductID = v.ProductID AND
                    bv.TechID = v.TechID AND
                    bv.ContactID = v.ContactID
              ORDER BY bv.LastName, bv.FirstName, bv.MiddleIni
              FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 1, 1, '') AS Buyers
FROM [MYVIEW] v
GROUP BY v.ProductID, v.TechID, v.ContactID

答案 2 :(得分:-3)

这样的事情会提供您正在寻找的输出吗?

SELECT LASTNAME + ', ' + FIRSTNAME + ' ' + MIDDLEINI
, ProductID
, TechID
, ContactID
. Priority
FROM MYVIEW
GROUP BY LASTNAME + ', ' + FIRSTNAME + ' ' + MIDDLEINI
, ProductID
, TechID
, ContactID
. Priority