LINUX.ORG.RU

sqlite как посчитать дубли строк включая проценты

 , , ,


0

2

Дано: sqlite база:

CREATE TABLE test_table (
    text TEXT
);[/sql]

Туда добавлено:

INSERT INTO test_table (
                           text
                       )
                       VALUES (
                           'test'
                       ),
                       (
                           'test'
                       ),
                       (
                           'test'
                       ),
                       (
                           'test2'
                       ),
                       (
                           'test2'
                       ),
                       (
                           'test3'
                       );

Сейчас есть вот такой запрос:

SELECT COUNT(*), text FROM test_table GROUP BY text ORDER BY COUNT(*) DESC
Он считает дубли строк и выдаёт результат с сортировкой по убыванию:
3	test
2	test2
1	test3

Меня всё тут устраивает, работает хорошо.

Задача: необходимо сделать так, чтобы:

  • 1. Добавить слева ещё одну колонку, чтобы в ней были проценты (то есть % сколько эта строка в дублях занимает от общего количества)
  • 2. Нужно чтобы проценты «бились», то есть если их все сложить вместе то должно получиться 100%, прошлые решения которые я нагуглил на стэке этого не давали, там всегда были дикие погрешности
  • 3. Проценты нужны с точностью до двух знаков
  • 4. И если возможно, то приятной мелочью будет там воткнуть сам знак процентов рядом с цифрой, но это не принципиальное условие, просто косметический эффект

Есть на форуме SQL ниндзя?



Последнее исправление: rubro (всего исправлений: 1)


select text,
       cnt,
       prcnt || '%' prcnt
from (
    SELECT text,COUNT(*) cnt,100/(select count(*) from test_table )* count(*) prcnt  
    FROM test_table 
    GROUP BY text 
    ORDER BY COUNT(*) DESC
) tmp

Держи, не знаю поддерживает ли sqlite подзапросы и те-ли проценты тебе нужны... смотри сам.

pup_kin
()
Ответ на: комментарий от pup_kin

так вот лучше, а то в предыдущем сообщении были целые числа и соответсвенно целочисленная ошибка при делении-умножении

select text,
       cnt,
       prcnt || '%' prcnt
from (
    SELECT text,COUNT(*) cnt,round( 100.0/(select count(*) from test_table )* count(*),2) prcnt  
    FROM test_table 
    GROUP BY text 
    ORDER BY COUNT(*) DESC
) tmp

pup_kin
()
Ответ на: комментарий от pup_kin

Большое спасибо!

Только оно всё же считает криво проценты:

test	3	48.0%
test2	2	32.0%
test3	1	16.0%

Считаем: 48+32+16=96, потеряно целых 4%, и как видно после десятичных почему-то нули всегда

rubro
() автор топика
Ответ на: комментарий от rubro

У вас sqlite какой-то кривой, должно быть 50% + 33.33% + 16.67% в варианте из второго сообщения, или 50% + 33% + 16% из первого. Попробуйте руками сделать select 100.0 / 6 * 3

deadNightTiger ★★★★★
()
Ответ на: комментарий от deadNightTiger

Выдаёт 48, сейчас буду разбираться

rubro
() автор топика
Ответ на: комментарий от deadNightTiger

Я работаю под виндой, скачал sqlite-tools-win32-x86-3150000.zip (1.53 MiB) запустил консоль, далее вижу вот такой результат, у вас по другому? Я так понял это самая свежая версия sqlite

rubro
() автор топика
Ответ на: комментарий от deadNightTiger

Вот такая ситуация из питона:

>>> import sqlite3
>>> db = sqlite3.connect(':memory:')
>>> cursor = db.cursor()
>>> cursor.execute('''select 100.0 / 6 * 3''')
<sqlite3.Cursor object at 0x000000CD00F035E0>
>>> cursor.fetchall()
[(50.0,)]

rubro
() автор топика
Ответ на: комментарий от pup_kin

У меня стоит пиратский navicat с рутрекера, результат я смотрел там. Можете и вы скачать себе, удобно работать с SQL-елем, не нужно ужиматся как сиротка в консольке.

pup_kin
()
Ответ на: комментарий от pup_kin

Набрал, всё гладко в питоне и в консоли sqlite, а вот в программе sqlitestudio округляет топорно, даже не смотря на то что я подменил библиотеку на новую.

В общем кривой оказался sqlite клиент.

Большое спасибо вам уважаемый коллега за помощь!

rubro
() автор топика

sqlite корректно считает select round(100.0/3, 2);. Результат - 33.33, как и предполагается.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.