SQL 如果 1 列包含相同数据,则追加其他列
SQL Append Other Column if 1 Column Contains the same Data
我的查询显示如下:
╔════════╦═════════╦══════════╦══════════╗
║ itemNo ║ buyerNo ║ sellerNo ║ itemDesc ║
╠════════╬═════════╬══════════╬══════════╣
║ 1 ║ B1 ║ S1 ║ Item1 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B2 ║ S2 ║ Item2 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B3 ║ S3 ║ Item2 ║
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B4 ║ S4 ║ Item3 ║
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B5 ║ S5 ║ Item3 ║
╚════════╩═════════╩══════════╩══════════╝
在上面的table中,itemNo
2
和3
是重复的。
如果发现 itemNo
重复,我想将 buyerNo
和 sellerNo
分组到同一个单元格中。 itemDesc
与每个 itemNo
相同。
╔════════╦═════════╦══════════╦══════════╗
║ itemNo ║ buyerNo ║ sellerNo ║ itemDesc ║
╠════════╬═════════╬══════════╬══════════╣
║ 1 ║ B1 ║ S1 ║ Item1 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B2, B3 ║ S2, S3 ║ Item2 ║ <-itemNo 2 combined
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B4, B5 ║ S4, S5 ║ Item3 ║ <-itemNo 3 combined
╚════════╩═════════╩══════════╩══════════╝
以下是我当前的查询:
public IQueryable GetAllInventorySummary()
{
var query = from summary in dataContext.Q_TBL_INVENTORY_SUMMARIES
group summary by new
{
itemNo = summary.itemNo,
buyerNo= summary.buyerNo,
sellerNo= summary.sellerNo,
itemDesc = summary.itemDesc,
} into grp
select new
{
itemNo = grp.Key.itemNo ,
buyerNo= grp.Key.buyerNo,
sellerNo= grp.Key.sellerNo,
itemDesc = grp.Key.itemDesc,
};
return query;
}
然后将其解析为我的主要方法:
RadGrid1.DataSource = inventory.GetAllInventorySummary();
您必须使用 GROUPBY and GROUP_CONCAT
函数来实现您的预期输出。
SELECT itemNo,
group_concat(buyerNo),
group_concat(sellerNo),
itemDesc
FROM summary
GROUP BY itemNo
您可以尝试仅按 itemNo
和 itemDesc
分组,然后使用 string.Join
连接字符串值。
您可以先尝试使用 linq to SQL select
来自数据库的数据,然后再执行 linq group by
.
var summaryList = (from summary in dataContext.Q_TBL_INVENTORY_SUMMARIES
select summary).ToList();
var result = from i in summaryList
group i by new
{
itemNo = i.itemNo,
itemDesc = i.itemDesc
} into grp
select new
{
itemNo = grp.Key.itemNo,
buyerNo = string.Join(",", grp.Select(i => i.buyerNo)),
sellerNo = string.Join(",", grp.Select(i => i.sellerNo)),
itemDesc = grp.Key.itemDesc
};
结果
1 B1 S1 Item1
2 B2,B3 S2,S3 Item2
3 B4,B5 S4,S5 Item3
编辑
因为Linq-to-SQL无法转换为SQL(感谢@Panagiotis Kanavos指出)
我建议你通过EF
SqlQuery
方法执行SQL 语句,这可以从DB
得到你预期的结果。然后通过 ORM
.
绑定
性能可能比我的第一个解决方案更好。
创建一个 SummaryDTO
来携带您的结果数据。
public class SummaryDTO {
public int itemNo { get; set; }
public string buyerNo { get; set; }
public string sellerNo { get; set; }
public string itemDesc { get; set; }
}
var result = dataContext.Q_TBL_INVENTORY_SUMMARIES
.SqlQuery("SELECT itemNo,
group_concat(buyerNo) buyerNo,
group_concat(sellerNo) sellerNo,
itemDesc
FROM summary
GROUP BY itemNo").ToList<SummaryDTO>();
我的查询显示如下:
╔════════╦═════════╦══════════╦══════════╗
║ itemNo ║ buyerNo ║ sellerNo ║ itemDesc ║
╠════════╬═════════╬══════════╬══════════╣
║ 1 ║ B1 ║ S1 ║ Item1 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B2 ║ S2 ║ Item2 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B3 ║ S3 ║ Item2 ║
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B4 ║ S4 ║ Item3 ║
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B5 ║ S5 ║ Item3 ║
╚════════╩═════════╩══════════╩══════════╝
在上面的table中,itemNo
2
和3
是重复的。
如果发现 itemNo
重复,我想将 buyerNo
和 sellerNo
分组到同一个单元格中。 itemDesc
与每个 itemNo
相同。
╔════════╦═════════╦══════════╦══════════╗
║ itemNo ║ buyerNo ║ sellerNo ║ itemDesc ║
╠════════╬═════════╬══════════╬══════════╣
║ 1 ║ B1 ║ S1 ║ Item1 ║
╠════════╬═════════╬══════════╬══════════╣
║ 2 ║ B2, B3 ║ S2, S3 ║ Item2 ║ <-itemNo 2 combined
╠════════╬═════════╬══════════╬══════════╣
║ 3 ║ B4, B5 ║ S4, S5 ║ Item3 ║ <-itemNo 3 combined
╚════════╩═════════╩══════════╩══════════╝
以下是我当前的查询:
public IQueryable GetAllInventorySummary()
{
var query = from summary in dataContext.Q_TBL_INVENTORY_SUMMARIES
group summary by new
{
itemNo = summary.itemNo,
buyerNo= summary.buyerNo,
sellerNo= summary.sellerNo,
itemDesc = summary.itemDesc,
} into grp
select new
{
itemNo = grp.Key.itemNo ,
buyerNo= grp.Key.buyerNo,
sellerNo= grp.Key.sellerNo,
itemDesc = grp.Key.itemDesc,
};
return query;
}
然后将其解析为我的主要方法:
RadGrid1.DataSource = inventory.GetAllInventorySummary();
您必须使用 GROUPBY and GROUP_CONCAT
函数来实现您的预期输出。
SELECT itemNo,
group_concat(buyerNo),
group_concat(sellerNo),
itemDesc
FROM summary
GROUP BY itemNo
您可以尝试仅按 itemNo
和 itemDesc
分组,然后使用 string.Join
连接字符串值。
您可以先尝试使用 linq to SQL select
来自数据库的数据,然后再执行 linq group by
.
var summaryList = (from summary in dataContext.Q_TBL_INVENTORY_SUMMARIES
select summary).ToList();
var result = from i in summaryList
group i by new
{
itemNo = i.itemNo,
itemDesc = i.itemDesc
} into grp
select new
{
itemNo = grp.Key.itemNo,
buyerNo = string.Join(",", grp.Select(i => i.buyerNo)),
sellerNo = string.Join(",", grp.Select(i => i.sellerNo)),
itemDesc = grp.Key.itemDesc
};
结果
1 B1 S1 Item1
2 B2,B3 S2,S3 Item2
3 B4,B5 S4,S5 Item3
编辑
因为Linq-to-SQL无法转换为SQL(感谢@Panagiotis Kanavos指出)
我建议你通过EF
SqlQuery
方法执行SQL 语句,这可以从DB
得到你预期的结果。然后通过 ORM
.
性能可能比我的第一个解决方案更好。
创建一个 SummaryDTO
来携带您的结果数据。
public class SummaryDTO {
public int itemNo { get; set; }
public string buyerNo { get; set; }
public string sellerNo { get; set; }
public string itemDesc { get; set; }
}
var result = dataContext.Q_TBL_INVENTORY_SUMMARIES
.SqlQuery("SELECT itemNo,
group_concat(buyerNo) buyerNo,
group_concat(sellerNo) sellerNo,
itemDesc
FROM summary
GROUP BY itemNo").ToList<SummaryDTO>();