SQL Добавить другой столбец, если 1 столбец содержит те же данные - PullRequest
0 голосов
/ 27 сентября 2018

Мой запрос отображает следующее:

╔════════╦═════════╦══════════╦══════════╗
║ itemNo ║ buyerNo ║ sellerNo ║ itemDesc ║
╠════════╬═════════╬══════════╬══════════╣
║ 1      ║ B1      ║ S1       ║ Item1    ║
╠════════╬═════════╬══════════╬══════════╣
║ 2      ║ B2      ║ S2       ║ Item2    ║ 
╠════════╬═════════╬══════════╬══════════╣
║ 2      ║ B3      ║ S3       ║ Item2    ║ 
╠════════╬═════════╬══════════╬══════════╣
║ 3      ║ B4      ║ S4       ║ Item3    ║ 
╠════════╬═════════╬══════════╬══════════╣
║ 3      ║ B5      ║ S5       ║ Item3    ║ 
╚════════╩═════════╩══════════╩══════════╝

В приведенной выше таблице itemNo 2 и 3 дублируются.

Я хотел бы сгруппировать buyerNoи sellerNo в ту же ячейку, если обнаружено, что itemNo дублируется.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();

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы можете попробовать сгруппировать только по itemNo и itemDesc, а затем использовать string.Join для подключения строковых значений.

Вы можете попробовать сначала использовать данные linq to SQL select из БД, затемdo 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 указать)

Я бы посоветовал вам выполнитьОператор SQL методом EF SqlQuery, который может дать ожидаемый результат от 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>();
0 голосов
/ 27 сентября 2018

Вы должны использовать функцию GROUPBY and GROUP_CONCAT для достижения ожидаемого результата.

SELECT itemNo,
       group_concat(buyerNo),
       group_concat(sellerNo),
       itemDesc
FROM summary
GROUP BY itemNo
...