Russian Qt Forum
Март 29, 2024, 18:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Конвертация и изменение в QTableView + SQL  (Прочитано 8074 раз)
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 модель?
Очень прошу помочь, совсем не представляю как это сделать.
Записан
GraninDm
Гость
« Ответ #1 : Март 23, 2016, 20:35 »

Можно. Смотрите в сторону group by, sum и т.д.
Хотя, для обсуждения вы хотя бы свой запрос привели...
Записан
derilshows
Гость
« Ответ #2 : Март 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)
Записан
Bepec
Гость
« Ответ #3 : Март 24, 2016, 00:13 »

Напишите свою хранимую процедуру на сервере sql и используйте её. Как вариант.
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #4 : Март 24, 2016, 00:37 »

Автор - конспиратор.

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

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

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

Сообщений: 371


Просмотр профиля
« Ответ #5 : Март 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;
Записан
derilshows
Гость
« Ответ #6 : Март 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(*)) не хочет делать.
Записан
derilshows
Гость
« Ответ #7 : Март 24, 2016, 00:55 »


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


Дело в том что Number у меня это count(*), а Sum(count(*)) делать не хочет
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #8 : Март 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;
« Последнее редактирование: Март 24, 2016, 01:26 от PimenS » Записан
derilshows
Гость
« Ответ #9 : Март 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(код)

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

Надеюсь все корректно описал)
« Последнее редактирование: Март 24, 2016, 01:26 от derilshows » Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #10 : Март 24, 2016, 01:27 »

ответил исправлением предыдущего поста

без Sum(count(*)) скорее всего все равно не обойтись.
« Последнее редактирование: Март 24, 2016, 01:38 от PimenS » Записан
derilshows
Гость
« Ответ #11 : Март 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, не помогает
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #12 : Март 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;
 
Записан
stetsenko
Гость
« Ответ #13 : Май 10, 2016, 23:10 »

как я раньше этот пост не нашел
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 23.