Запрос SQLITE GROUP BY с SUM Использование Delphi и Zeos

У меня есть приложение, созданное с использованием Delphi XE3, которое обращается к базе данных SQLite с помощью компонента Zeos.

Команда select в SQLite, которая возвращает 3 строки:

 select p.descricao, pg.valor
from pagamento pg
inner join venda v on pg.origem = 'venda' and v.id_venda = pg.id_origem
left join pagamento_tipo p on pg.id_pagamento_tipo = p.id_pagamento_tipo
where v.data >= '2021-01-19' and v.data <= '2021-01-19'
and v.ra_status_venda in ( 'Finalizado', 'Pedido')

введите здесь описание изображения

но когда я ставлю групповую команду, результат информации неверен.

    select p.descricao, sum(pg.valor) as valor
from pagamento pg
inner join venda v on pg.origem = 'venda' and v.id_venda = pg.id_origem
left join pagamento_tipo p on pg.id_pagamento_tipo = p.id_pagamento_tipo
where v.data >= '2021-01-19' and v.data <= '2021-01-19'
and v.ra_status_venda in ( 'Finalizado', 'Pedido')
group by descricao

введите здесь описание изображения

P02 не сумма.

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

select sum(pg.valor) as valor
from pagamento pg
inner join venda v on pg.origem = 'venda' and v.id_venda = pg.id_origem
left join pagamento_tipo p on pg.id_pagamento_tipo = p.id_pagamento_tipo
where v.data >= '2021-01-19' and v.data <= '2021-01-19'
and v.ra_status_venda in ( 'Finalizado', 'Pedido')

введите здесь описание изображения

PS: в другом периоде эти команды суммируются правильно. PS2 Я использую 32-битную dll для Windows.


person Márcio Rossato    schedule 20.01.2021    source источник
comment
Неправильно использовать , в качестве десятичного разделителя для числовых значений. Вы должны использовать .. В любом случае в результате вы должны получить не 0, а 39. Можете воспроизвести проблему на скрипке: dbfiddle.uk/?rdbms=sqlite_3.27   -  person forpas    schedule 20.01.2021
comment
Спасибо за ваш ответ. , используются для отображения десятичного разделителя в моей стране, но значение в базе данных было правильным как плавающее. Я попробую поставить скрипку.   -  person Márcio Rossato    schedule 20.01.2021
comment
Поле базы данных имеет тип NUMERIC.   -  person Márcio Rossato    schedule 20.01.2021
comment
Что даст вам добавление typeof(pg.valor) к столбцам результатов с вашим первым запросом?   -  person Shawn    schedule 20.01.2021
comment
typeof(pg.valor) возвращает целое, целое, действительное.   -  person Márcio Rossato    schedule 20.01.2021
comment
Те выглядят хорошо. Да, настройте скрипт с демонстрационными данными, который воспроизводит это, если можете; Я не вижу ничего очевидного, особенно с учетом вашего редактирования.   -  person Shawn    schedule 20.01.2021
comment
Спасибо за советы, решаю с вашей помощью. Форсирование поля доблести как Real. выберите descricao, sum(cast(pg.valor as Real)) как доблесть.   -  person Márcio Rossato    schedule 20.01.2021
comment
Но знаете ли вы, почему SQLite считает мое поле целым числом, если в таблице оно NUMERIC?   -  person Márcio Rossato    schedule 20.01.2021
comment
Вот что делает числовое сходство. См. sqlite.org/datatype3.html#type_affinity.   -  person Shawn    schedule 20.01.2021
comment
Целым считается не столбец, а значение этого столбца: sqlite.org/lang_corefunc. html#тип   -  person forpas    schedule 20.01.2021
comment
Я изменю тип с NUMERIC на Real для таблиц, чтобы избежать этой проблемы, если это сработает, я опубликую это здесь,   -  person Márcio Rossato    schedule 20.01.2021


Ответы (1)


С помощью советов @Shawn и @forpas я решаю эту проблему, тип поля SQLite NUMERIC преобразует числа в другие типы в команде выбора RUNTIME, как два первых значения были INTEGER, а последнее значение было Real, по-видимому, моя программа не распознает два разных типов в одном столбце.

Чтобы решить, я меняю тип поля в базе данных с NUMERIC на REAL.

person Márcio Rossato    schedule 21.01.2021
comment
SQLite не преобразует числа в другие типы, если вы явно не примените это преобразование с помощью кода. Также SQLite прекрасно суммирует целые и вещественные значения. Проблема, которую вы описали в своем вопросе, не воспроизводится, поэтому мы не знаем источник проблемы. - person forpas; 21.01.2021
comment
Проверьте это: dbfiddle.uk/ - person forpas; 21.01.2021
comment
Я использую win 32 dll, и результат отличается от fiddle. Я обновил dll до самой последней версии, прежде чем открывать этот вопрос. - person Márcio Rossato; 21.01.2021
comment
В любом случае, как я не могу проверить, не связана ли проблема с DLL, я отредактировал ответ. спасибо - person Márcio Rossato; 22.01.2021
comment
Кроме того, используя созданную вами скрипку, я изменил тип на реальный, и тип во всех строках одинаков (настоящий) "nofollow noreferrer">dbfiddle.uk/ - person Márcio Rossato; 22.01.2021
comment
В моем первом комментарии к вашему вопросу я сказал: Неправильно использовать , как десятичный разделитель для числовых значений, и вы ответили: значение в базе данных было правильным как float. Итак, может быть, проблема заключается в приложении, которое вы используете для получения результатов вашего запроса? Выполняйте операторы sql непосредственно в своей базе данных с помощью такого инструмента, как DB Browser for SQLite, с последней версией SQLite. Если вы получаете правильные результаты, вы знаете, что проблема в вашем приложении. Если результаты неверны (в чем я сомневаюсь), то проблема, как я подозреваю, связана с вашими данными. - person forpas; 22.01.2021
comment
SQLite использует динамическую систему типов, поэтому тип данных столбцов здесь не важен. Вы можете получить правильные результаты, даже если тип данных столбцов TEXT: /а> - person forpas; 22.01.2021
comment
Вы правы, я считаю, что проблема действительно в моем приложении. спасибо - person Márcio Rossato; 22.01.2021
comment
Я также отредактировал вопрос, чтобы объяснить инструменты, которые я использую. - person Márcio Rossato; 22.01.2021
comment
Я не знаком с Delphi или Zeos, но было бы полезно опубликовать код приложения, которое возвращает эти результаты, так что, возможно, у кого-то может быть решение для вас. - person forpas; 22.01.2021