powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Для колонки посчитать количество в других колонок
8 сообщений из 8, страница 1 из 1
Для колонки посчитать количество в других колонок
    #39966912
LumisD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Пытался гуглить, но я даже не понимаю как правильно сформулировать коротка вопрос, т.е я даже не уверен что заголовок правильный. Вот описание что я хочу:

Есть таблица:
id, name, city
В ней следующие записи
1 Витя Москва
2 Коля Питер
3 Витя Питер
4 Лена Москва

я хочу сделать сортировку по полям
____ Москва Питер
Все ...... 2 ......2
Витя ..... 1 ..... 1
Коля ..... 0 ..... 1
Лена ..... 1 ..... 0

т.е мне нужно взять все уникальные значения одного поля (name) и найти их количество для уникальных значений другого поля (city)
Как это сделать?
Также хочу выводить тотал
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На каком языке программирования ты хочешь решать эту задачу?
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966915
LumisD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
я программирую на андроид и запросы в бд имеют такой вид
Код: java
1.
2.
@Query("SELECT name FROM credit_card_type_lu where credit_card_type_id = :creditCardTypeId limit 1")
    public String getCreditCardTypeNameByCreditCardTypeId(long creditCardTypeId);



мне нужно понять принцип как это делается, можно конечно тупо взять записи из бд и написать код перебора, но я уверен что sql умеет сама делать такие таблицы как я хочу
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966946
LumisD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как это можно сделать:
1)Получить список уникальных имен: names
SELECT DISTINCT name FROM table
2)Получить список уникальных городов: cities
SELECT DISTINCT city FROM table
3)Перебор names и cities с запросом в бд
SELECT COUNT(city) FROM table WHERE name = some_name AND city = some_city
4)Получить тотал:
SELECT COUNT(city) FROM table WHERE name = some_name

Посколько имен 3 и городов 2, то запросов будет 3 * 2 = 6
Но для таблиц с 100 городами и 100 именами запросов будет 100*100 = 10 000, что видимо будет исполняться очень долго

Как это сделать одним-двумя запросами для любого количества городов и имен?
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966949
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumisD,
то, что ты ищешь, в русском языке называется трансформацией строк в столбцы.
в английском для этого используется термин pivoting.

Дальше все (включая ограничения) зависит от диалекта sql.
Где-то (ms access) для выполнения такой задачи используется ключевое слово transform,
в большинстве случаев - pivot.

Во первых, такого рода техника есть не во всех диалектах.
Во вторых, сама она строится вокруг group by,
(если нужно перевести конструкцию в диалект, где для этого нет готового ключевого слова).

Но можно ли при этом одним запросом вывести еще и итоги - зависит от деталей устройства
(поддерживаемого синтаксиса) group by в конкретном диалекте sql.

Вопрос про запрос надо задавать всегда по отношению к конкретному диалекту sql.
Переводится полученный ответ, и как, на другой диалект - требует указания конкретного другого диалекта.

"Универсальный" sql существует только в текстах стандартов, в конкретных реализациях его нет.
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966950
LumisD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,
спасибо за совет!
К сожалению первоначальный мой пост уже не редактируется, я не упомянул некоторые важные детали, как например, что это sqlite.
Я написал пост сюда:
https://stackoverflow.com/questions/62252692/sqlite-query-to-get-table-based-on-values-of-another-table
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39966969
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что требуется, называется PIVOT, или перекрёстный запрос. SQLite эту штуку не поддерживает (даже не упоминает в документации).

В СУБД, не поддерживающих PIVOT, его эмулируют динамическим SQL. Однако и с этим у SQLite напряжёнка - нету, хоть убейся.

А потому решение единственное - строить текст запроса на клиенте, а потом выполнять в SQLite (или первым запросом прямо на стороне SQLite построить текст второго запроса - это несложно, SQLite знает про GROUP_CONCAT()). Для построения текста запроса предварительно потребуется получить отдельным запросом список городов

Код: sql
1.
SELECT DISTINCT city FROM table; 



после чего строить и выполнять текст запроса типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT name, 
       COUNT(CASE WHEN city = 'Москва' THEN 1 END) "Москва",
       COUNT(CASE WHEN city = 'Питер' THEN 1 END) "Питер",
... 
       COUNT(CASE WHEN city = 'Урюпинск' THEN 1 END) "Урюпинск"
FROM table
GROUP BY name;



Общую сумму придётся считать либо отдельным запросом (или подзапросом), либо по итогам перекрёстного запроса - многие СУБД используют для этого WITH ROLLUP, но SQLite и этого не поддерживает.

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
Для колонки посчитать количество в других колонок
    #39967221
LumisD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо!
Работающий запрос в конце концов выглядит так:

Код: sql
1.
2.
3.
4.
SELECT name, 
COUNT(CASE WHEN city = :london THEN 1 END) as countLondon, 
COUNT(CASE WHEN city = :paris THEN 1 END) as countParis 
FROM table2 GROUP BY name



Т.к это андроид приложение и используется Room для работы с БД, то результат будет в виде листа POJO класса и он должен содержать поля:
Код: java
1.
name: String, countLondon: Int?, countParis: Int?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Для колонки посчитать количество в других колонок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]