我对结果集进行分组时遇到问题。
我需要将Tab_1_colName
上的结果和Tab_2_Order
的结果顺序(不同部分)分组,如果它们具有相同的Tab_2_Ids
。
所以我有第一个结果集,如下所示:
Tab_1_colName Tab_2_colName Tab_2_Id Tab_2_Order
Name_1 Type_1 16 10
Name_1 Type_2 17 20
Name_1 Type_3 18 30
Name_2 Type_1 16 10
Name_2 Type_2 17 20
Name_2 Type_3 18 30
Name_3 Type_1 16 400
Name_3 Type_2 17 500
Name_3 Type_3 18 600
Name_4 Type_1 16 10
Name_4 Type_3 18 20
Name_4 Type_2 17 30
我需要的结果如下:
Group1 => (Name_1 - Name_3) with the IDs in this order (16, 17, 18),
Group2 => (Name_4) with the IDs in this order (16, 18, 17)
我没有想到如何实现这个目标。我试图将它直接分组在数据库上,但我坚持
SELECT
Tab_1_colName, Tab_2_Id
FROM
Tab_1,
Tab_2
WHERE
Tab_1_othderID = Tab_2_othderID
group by
Tab_2_Id, Tab_1_colName
我的第二个想法是尝试使用linq,但是我的问题就像使用纯sql一样快速尝试
dt.Rows.OfType<DataRow>().OrderBy(x => x["Tab_2_Order"]).GroupBy(r => r["Tab_2_Id"])
任何想法如何解决我的问题?
编辑:
预期结果:
第一行:Name_1,其中Tab_2_Ids顺序为tab_2_order。
第二行:Name_4,Tab_2_Ids顺序为tab_2_order。
(Name_2和Name_3应该与Name_1在同一个组中,因为它们在相同的顺序中具有相同的Tab_2_Ids)
答案 0 :(得分:0)
你不使用聚合功能,所以你不需要通过.. 而是使用disticnt选择不同的值和/或order by来排序结果,例如:
SELECT distinct
Tab_1_colName, Tab_2_Id
FROM
Tab_1,
Tab_2
WHERE
Tab_1_othderID = Tab_2_othderID
order by
Tab_2_Id, Tab_1_colName
答案 1 :(得分:0)
解决了我的问题。在另一个用户的帮助下,不幸的是在我运行它之前删除了他的anwser。 :(
非常感谢你! :)
无论如何,这是我的解决方案:
var dtRows = dt.Rows.OfType<DataRow>();
var rows = dtRows.GroupBy(r =>
String.Join(",", dtRows.Where(q => q[0] == r[0]).OrderBy(o => o[3]).Select(s => s[0]).ToArray()),
x => x[2],
(key, g) => new Tuple<string, string[]>(key, g.Where(s => s != null).Select(s => s.ToString()).ToArray().Distinct().ToArray())
).ToList();
List<Tuple<string, string[], List<string>>> rowsToWrite = new List<Tuple<string, string[], List<string>>>();
foreach (var row in rows)
{
if (!rowsToWrite.Any(x => x.Item2.SequenceEqual(row.Item2)))
rowsToWrite.Add(Tuple.Create(row.Item1, row.Item2, new List<string>()));
else
rowsToWrite.Select(x => x).Where(x => x.Item2.SequenceEqual(row.Item2)).First().Item3.Add(row.Item1);
}