Russian Qt Forum

Qt => Базы данных => Тема начата: derilshows от Март 23, 2016, 00:11



Название: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 23, 2016, 00:11
Всем привет! Очень нужен Ваш совет.

Есть БД, где в одной колонке записаны коды в виде: 10, 10-09, 10-10, 10-11, 15, 15-02, 15-03 и тд. Каждому значению соответсвтует месяц(в числовом формате). Я делаю SQL запрос, в котором выводится какие коды в каком месяце, с подсчетом сколько раз были вызваны. Запрос отображается в QTableView.
Выходит формат: СКОЛЬКО РАЗ БЫЛ ВЫЗВАН, В КАКОМ МЕСЯЦЕ, КАКОЙ КОД.
Например, будет вывод:

125, 04, 10-09
4, 04, 10-10
93, 05, 15-02
43, 05, 15-03


Что я хочу:

Все коды, которые начинаются на две одинаковые цифры, должны обьединиться в одну строку, и уже отображаться только этими первыми двумя цифрами. Но нужно сохранить сортировку по месяцам, дабы коды из разных месяцев не склеивались. Естественно, первая коллонка(сколько раз был вызван) при обьединении должна суммировать соответственные значения строк, что склеиваются.

В итоге, должно выйти так:
129, 04, 10
136, 05, 15


Можно ли решить этот вопрос чисто SQL? Или нужно использовать QT модель?
Очень прошу помочь, совсем не представляю как это сделать.


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: GraninDm от Март 23, 2016, 20:35
Можно. Смотрите в сторону group by, sum и т.д.
Хотя, для обсуждения вы хотя бы свой запрос привели...


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 23, 2016, 22:47
Я спрашивался с одной задачей(теперь в третьей колонке значения отображаются как их первые две цифры).

Структура такова:
Числовое значение, месяц, код
Number, Month, Code

Например. При запросе был такой вывод:
200 02 04-03
30 02 04-04
10 03 04-05

Теперь(третья колонка изменилась).
200 02 04
30 02 04
10 03 04

Но результат должен выглядеть так:
230 02 04
10 03 04

То есть, если значения третьей колонки одинаковы, и их месяца тоже, эти строчки нужно соеденить в одну, при условии что в первой колонке должна быть сумма соедененных значений.

(Показано в примере, было 200 и 30 в двух строчках, но их месяцы оказались одинаковы, и коды в третьей колонке после преобразования, тоже, поэтому они стали одной единой строкой, где в числовые значения из первой коллонки суммировались).

Надеюсь, корректно описал суть проблемы.

Собственно, SQL код на данный момент:


Код
SQL
SELECT NUMBER, MONTH, COUNT(*), split_part(code, '-', 1)
 FROM tab
GROUP BY MONTH, split_part(code, '-', 1)


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: Bepec от Март 24, 2016, 00:13
Напишите свою хранимую процедуру на сервере sql и используйте её. Как вариант.


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: vbv от Март 24, 2016, 00:37
Автор - конспиратор.

1. Какая СУБД?
2. DDL собственно таблицы?
3. Запрос возвращает 4-е колонки. В примере выдачи 3. как?

продолжим:
1. Что мешает сделать SUM(NUMBER).
2. Как вообще работает приведенный запрос т.к. NUMBER не указан под GROUP BY и не аггрегирован - субд должен выругаться.

Тут комментария 2:
1. Почитать чего-то по поводу SQL вообще и по поводу конкретной СУБД в частности.
2. Тупо написать исходную таблицу и необходимую выдачу указав при этом СУБД в тему.  Кто-то, из форумчан,  напишет запрос и его использовать. Не разбираясь в SQL.


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: PimenS от Март 24, 2016, 00:49
Но результат должен выглядеть так:
230 02 04
10 03 04

То есть, если значения третьей колонки одинаковы, и их месяца тоже, эти строчки нужно соеденить в одну, при условии что в первой колонке должна быть сумма соедененных значений.

Ну так и суммируйте ту колонку в которой должна быть сумма

Код:
SELECT sum(Number) AS sum, month, left(code, 2) AS code
FROM tab GROUP BY month, code;


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 24, 2016, 00:53
Автор - конспиратор.

1. Какая СУБД?
2. DDL собственно таблицы?
3. Запрос возвращает 4-е колонки. В примере выдачи 3. как?

продолжим:
1. Что мешает сделать SUM(NUMBER).
2. Как вообще работает приведенный запрос т.к. NUMBER не указан под GROUP BY и не аггрегирован - субд должен выругаться.

Тут комментария 2:
1. Почитать чего-то по поводу SQL вообще и по поводу конкретной СУБД в частности.
2. Тупо написать исходную таблицу и необходимую выдачу указав при этом СУБД в тему.  Кто-то, из форумчан,  напишет запрос и его использовать. Не разбираясь в SQL.

PostgreSQL
Прошу прощения за некорректный sql-запрос. Number у меня и есть count(*).
Корректный будет
Код
SQL
SELECT COUNT(*), MONTH, split_part(code, '-', 1)
 FROM tab
GROUP BY MONTH, split_part(code, '-', 1)

Что мешает сделать сумму выведенных значений... SUM(COUNT(*)) не хочет делать.


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 24, 2016, 00:55

Ну так и суммируйте ту колонку в которой должна быть сумма


Дело в том что Number у меня это count(*), а Sum(count(*)) делать не хочет


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: PimenS от Март 24, 2016, 00:59
Самый простейший вариант.

Создаете VIEW

Код:
CREATE VIEW count_code AS SELECT count(*), monthz, left(code, 2) AS code FROM tab GROUP BY monthz, code;

а уже потом запрос осуществляете из представления

Код:
SELECT sum(count), monthz, code FROM count_code GROUP BY monthz, code;


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 24, 2016, 01:23
Код
SQL
SELECT  count(*) AS Всего_записей, MONTH,  split_part(code, '-', 1) AS Код
FROM  Разные таблицы
WHERE разные таблицы по ключевым полям связываются
GROUP BY 2, split_part(code, '-', 1)

Естественно что поля count(*) нет.

Записи в БД делаются так:
Время, Код
Время, Код
Время, Код.

Мини пример:
02(месяц), 0203
02, 0203

И результат запроса будет:
2(2 раза было записано), 02(месяц), 0203(код)

Я своим запросом делаю выборку по коду, сортирую его по месяцам и вывожу число, сколько раз в этом месяце он был вызван.

Надеюсь все корректно описал)


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: PimenS от Март 24, 2016, 01:27
ответил исправлением предыдущего поста

без Sum(count(*)) скорее всего все равно не обойтись.


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: derilshows от Март 24, 2016, 01:49
Как сделать это все одним запросом? Сделал
Код
SQL
CREATE VIEW count_code AS SELECT count(*), monthz, LEFT(code, 2) AS code FROM tab GROUP BY  monthz, code;
 
SELECT sum(count), monthz, code FROM count_code GROUP BY monthz, code;
 

ОШИБКА:  ошибка синтаксиса (примерное положение: "select").

Пробовал сделать с GO, не помогает


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: Old от Март 24, 2016, 08:44
Как сделать это все одним запросом? Сделал
Можно делать выборку из результата другой выборки, примерно так:
Код
SQL
SELECT sum(cnt), monthz, code FROM (SELECT COUNT(*) AS cnt, monthz, LEFT(code, 2) AS code FROM tab GROUP BY monthz, code ) AS src;
 


Название: Re: Конвертация и изменение в QTableView + SQL
Отправлено: stetsenko от Май 10, 2016, 23:10
как я раньше этот пост не нашел