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中,itemNo23是重复的。

如果发现 itemNo 重复,我想将 buyerNosellerNo 分组到同一个单元格中。 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

您可以尝试仅按 itemNoitemDesc 分组,然后使用 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
                };

c# demo

结果

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>();