@fridriekh
Фулл-тайм эникей

Как вывести массив из базы с группировкой по значениям столбца?

Мне надо вывести результат этого запроса

SELECT
r.name region
, o.name organization
, co.name object
, b.name boiler
, b.inventory_number
, hm.counts_number
, c.start_date date
, co.address
, LTRIM(RTRIM(c.number)) number
, bu.name budget
FROM com_jur2015..contracts c
LEFT JOIN com_jur2015..budgets bu ON bu.id = c.id_budget 
LEFT JOIN com_jur2015..contract_objects co ON co.number = c.number 
LEFT JOIN com_jur2015..organizations o ON o.id = c.id_organization 
LEFT JOIN com_jur2015..cities ci ON ci.id = co.id_city 
LEFT JOIN com_jur2015..municipals m ON ci.id_municipal = m.id 
LEFT JOIN com_jur2015..regions r ON r.id = co.id_region 
LEFT JOIN com_jur2015..boilers b ON b.id = co.id_boiler 
LEFT JOIN com_jur2015..counts hm ON o.id = hm.id_organization 
WHERE c.dead = 0 AND r.name IS NOT NULL 
ORDER BY r.name, o.name, co.name


в таком виде

| Регион |
| Тип бюджета |
Организация | Объект | Котельная | и т.д.

Сейчас я вывожу это, таким образом:
Заранее сортирую строки через запрос и вывожу, сравнивая текущее значение столбца с предыдущим

SqlDataReader reader = query.ExecuteReader();
            int i = 7;
            string region = "Ноль";
            string budget_type = "Ноль";
            while (reader.Read())
            {
                //string date_after_convert;
                //string date_before_convert = reader["date"].ToString();

                //форматирование времени, т.к. дата вытаскивается в таком виде гггг-мм-дд чч:мм:сс

                //if (date_before_convert == "") date_after_convert = "";
                //else date_after_convert = DateTime.Parse(date_before_convert).ToShortDateString();

                //вывод [0] столбца в консоль, для проверки корректности получения данных
                //чтоб проверить вывод, в свойствах выбери console app
                //Console.WriteLine(reader[0]);
                
                //херится красивый внешний вид, если нарушается порядок сортировки
                //надо найти аналог group_concat из mysql
                if (region != reader["region"].ToString()) {
                    region = reader["region"].ToString();
                    ws.Range["A" + i + ":O" + i].Merge();
                    ws.Range["A" + i + ":O" + i].BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium);
                    ws.Range["A" + i + ":O" + i].Value = region;
                    i++;
                }
                if (budget_type != reader["budget"].ToString()) {
                    budget_type = reader["budget"].ToString();
                    ws.Range["A" + i + ":O" + i].Merge();
                    ws.Range["A" + i + ":O" + i].BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium);
                    ws.Range["A" + i + ":O" + i].Value = budget_type;
                    i++;
                }
                ws.Range["A"+i].Value = reader["organization"].ToString();
                ws.Range["B"+i].Value = reader["object"].ToString();
                //Берем название котельной, вырезаем слово "котельная", подаем на вывод
                ws.Range["C" + i].Value = reader["boiler"].ToString().Replace("котельная","")+" "+reader["inventory_number"].ToString();
                ws.Range["F" + i].Value = reader["counts_number"].ToString();
                i++;
                //= reader["region"].ToString(),
            }


Все работает, но мне кажется, что можно было сделать лучше и красивее
  • Вопрос задан
  • 445 просмотров
Решения вопроса 1
@Flashmond
Студент, инженер-программист c#
Добавьте в запрос Group By
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы