如何从 GROUP BY 子句中获取唯一值



我有一个表,其中包含唯一标识符列,关系键列和varchar列。

|  Id  |  ForeignId  |  Fruits  | 
--------------------------------- 
|  1   |      1      |  Apple   |  
|  2   |      2      |  Apple   |  
|  3   |      3      |  Apple   |  
|  4   |      4      |  Banana  |  

我想做的是按水果列对数据进行分组,并返回该特定组中所有 ForeignId 键的列表。这样:

|  Fruit  |  ForeignKeys  |
---------------------------
|  Apple  |  1, 2, 3      |
|  Banana |  4            |

到目前为止,我有SQL可以得到分组的水果值,因为这微不足道。但是我似乎找不到检索组中包含的 ForeignKeyId 值的好解决方案。

SELECT Fruits FROM FruitTable

我在MySql中找到了GROUP_CONCAT函数,它似乎可以满足我的需要,但在SQL Server 2017中似乎不可用。

任何这方面的帮助将不胜感激。

>如果您使用的是 SQL Server 2014 或更早版本:

SELECT  Fruit       = Fruits 
,ForeignKeys    = STUFF(
(SELECT ',' + CAST(ForeignId AS VARCHAR(100))
FROM    FruitTable t2
WHERE   t1.Fruits = t2.Fruits 
FOR XML PATH ('')
)
,1,
1,
''
) 
FROM    FruitTable t1
GROUP   BY Fruits;

如果您使用的是 SQL Server 2016 或更高版本,您还可以编写以下更简单的方法:

SELECT  Fruit = Fruits, ForeignKeys = STRING_AGG(ForeignId, ',')
FROM    FruitTable
GROUP   BY Fruits;
SELECT fruits,  foreignkeys = STUFF(
(SELECT ',' + foreignid
FROM fruittable t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') 
from fruittable 
group by fruits

这应该有效。

最新更新