我在数据库中有如下一组行
ID,CompName,identifier,DesId,SubId,SRO,PDiam
-----------------------------------------------
1,resistor,R1,10,20,30,45
2,resistor,R2,10,20,40,50
3,capacitor,C1,10,20,33,5
4,Inductor,I1,10,20,22,32
1,Inductor,I2,10,20,42,52
我试图将它们分组,并根据其标识符进行siplay,如下所示。 假设列分隔符是pipe(|)
Ids|CompName|SRO|PDiam
-------------------------------
R1,R2|resistor|30|45 //Since there are two resistors, 2 rows foreach SRO and Pdiam Pair
R1,R2|resistor|40|50
C1|Capacitor|33|5 //One Row for Capacitor as only 1 component in DB and one pair of SRO and Pdiam Pair
I1,I2|Inductor|22|32 //2 Rows for 2 capacitors and 1 row for each pair of SRO and PDiam
I1,I2|Inductor|42|52
我知道我们应该使用group by,但是不确定如何高效地进行分组。我能想到的唯一方法是遍历Group by ComponentName和Identifier的结果,但是这对我来说似乎太复杂了。
有什么更好的方法可以实现这一目标?
答案 0 :(得分:0)
您可以将表与表的聚合版本进行联接。汇总表将按CompName分组,并在标识符上使用字符串汇总功能。
SELECT G.Ids, T.compname, T.SRO, T.PDiam FROM
components T LEFT JOIN
(SELECT compname, STRING_AGG(identifier, ',') ids FROM components GROUP BY compname) G
ON T.compname = G.compname
(未经测试)
但是,字符串聚合在SqlServer 2017之前的T-SQL中是有问题的,因此可能很难做到。参见this post
如果您需要在EF中执行此操作,则方法将相同。不知道是否可以将字符串聚合函数“导出”到EF。 (应该是可能的。)
对于EF中的小数据,您可以使用类似this