我在组合多个表后在我的数据库中创建了以下视图。 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中的自定义聚合函数将结果合并到单个列中。如果您能帮我查询,请告诉我。
答案 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
这是获得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