C # группа с условным - PullRequest
       3

C # группа с условным

0 голосов
/ 23 ноября 2011

как я могу сгруппировать данные с условным условием, если счет <10? </p>

у меня есть таблица:

meetingId | bill
------------------
     a    |     6
     b    |     7
     c    |     1
     a    |     5
     a    |     3
     b    |     4
     g    |     2

ожидаемые результаты: a = 6 + 5 + 3 = 14 ограничение равно 10-> 10 и 4
b = 7 + 4 = 11, поэтому ограничение равно 10 -> 10 и 1
c и g не превышает ограничение.

meetingId | bill
------------------
     a    |     10
     a    |     4
     b    |     10
     b    |     1
     c    |     1
     g    |     2

я пробовал в SQLпочему, но я придерживался, если условие

мой SQL:

 SELECT NO_ORDRE
      ,ORDRE.CODE_CLIENT As CodeCl 
      ,[CODE_DEST]  
      ,ORDRE.RS_NOM As OrdreRS
      ,ORDRE.ADRESSE As OrdreAdr
      ,ORDRE.CP As OrdreCP
      ,ORDRE.VILLE As OrdreVille
      ,ENLEV_CREMB
      ,ENLEV_DECL
      ,MODAL_MODE
      ,[PAYS]
      ,[INSEE]
      ,[SIRET]
      ,ORDRE.TEL As OrdreTel
      ,ORDRE.FAX As OrdreFax
      ,[EMAIL]     
      ,[NBR_COLIS]
      ,[POID]   
      ,[OBS]
      ,[DATE_CREE]
      ,[DATE_MODIF]
      ,[REF_EXPED]
      ,[AUTRE_REF]
      ,[AGENCE]
      ,[TRANSPORTEUR]
      ,NOM
      ,CAPITAL
      ,LIBELLE
      ,T_LOGO.IMG As FaImg
      ,T_LOGO.ADRESSE As FaAdr
      ,T_LOGO.CP As FaCp
      ,T_LOGO.VILLE As FaVille
      ,T_LOGO.TEL As FaTel
      ,T_LOGO.FAX As FaFax
      ,FAWEB_CLIENT.RS_NOM As CliRsNom
      ,FAWEB_CLIENT.ADRESSE As CliAdr
      ,FAWEB_CLIENT.CP As CliCp
      ,FAWEB_CLIENT.VILLE As CliVille
  FROM [ORDRE]
  LEFT JOIN T_LOGO ON ORDRE.TRANSPORTEUR = T_LOGO.NOID
  LEFT JOIN FAWEB_CLIENT ON ORDRE.CODE_CLIENT = FAWEB_CLIENT.CODE_CLIENT
 WHERE (STATUT_ORDRE = 2) AND (TRANSPORTEUR IN (SELECT ParsedString From dbo.ParseStringList(@Trans)))

, а затем я использую в C #

List<Pers_Ordre> oListOrdre = new List<Pers_Ordre>();
                while (readerOne.Read())
                {
                   Pers_Ordre oPerOrdr = new Pers_Ordre();
                   Pers_Ordre test =  (from t in oListOrdre where t.DestId == readerOne["CODE_DEST"].ToString() select t).FirstOrDefault();


                    oPerOrdr.OrdreId = Convert.ToInt32(readerOne["NO_ORDRE"]);
                    oPerOrdr.DestId = readerOne["CODE_DEST"].ToString();

                    if (test == null)
                    {
                        oListOrdre.Add(oPerOrdr);
                    }
                    else
                    {
                        int NbrColis = (from t in oListOrdre where t.DestId == readerOne["CODE_DEST"].ToString() select t.NbrColis).FirstOrDefault();
                        if (NbrColis < 5)
                        {
                            test.NbrColis += NbrColis;
                        }
                    }
                }

это не работает, что я ожидал.

Спасибо за помощь!

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

(Не совсем ответ, но это не подходит для комментария.)
Вот запрос LINQ-to-Objects, который группирует элементы по meetingId и создает новые элементы, так что есть один элемент с bill меньше 10 и столько элементов, сколько нужно с bill, равным 10 для сохранения суммы: 1007 *

Screenshot

Это то, что вы ищете?

Код:

var list = new List<Tuple<char, int>>
{
    Tuple.Create('a', 6),
    Tuple.Create('b', 7),
    Tuple.Create('c', 1),
    Tuple.Create('a', 5),
    Tuple.Create('a', 3),
    Tuple.Create('b', 4),
    Tuple.Create('g', 2),
};

var result = list
    .GroupBy(x => x.Item1)
    .Select(g => new
    {
        Key = g.Key,
        Sum = g.Sum(x => x.Item2)
    })
    .Select(p => new
    {
        Key = p.Key,
        Items = Enumerable.Repeat(10, p.Sum / 10)
                          .Concat(Enumerable.Repeat(p.Sum % 10, 1))
    })
    .SelectMany(p => p.Items.Select(i => Tuple.Create(p.Key, i)))
    .ToList();
1 голос
/ 23 ноября 2011

Этот запрос SQL вернет желаемые результаты:

SELECT meetingId, SUM(bill) as bill_total
FROM table
GROUP BY meetingId
HAVING SUM(bill) < 10
1 голос
/ 23 ноября 2011
table.GroupBy(p => p.meetingId).Where(p => p.Sum(q => q.bill) < 10)
.Select(p => new
{
    meetingId= p.Key,
    bill= p.Sum(q => q.bill)
});
1 голос
/ 23 ноября 2011

Вы не должны делать это на стороне клиента, потому что это может стать довольно интенсивным, простой GROUP BY с предложением HAVING должен дать вам ожидаемые результаты:

Пример данных:

enter image description here

Необходимый вам запрос:

SELECT 
    MeetingID, 
    SUM(bill) AS Total
FROM 
    Table_1 
GROUP BY 
    MeetingID 
HAVING 
    SUM(bill) < 10

Результаты запроса:

enter image description here

...