Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Запрос на вычисление процента / 6 сообщений из 6, страница 1 из 1
11.05.2017, 14:17
    #39451375
gammaray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
Пусть есть таблица А (id, name) и таблица B (id, a_id, date, price). Связь А к B 1 ко многим по внешнему ключу A.id -> B.a_id. Необходимо подневно вывести name с максимальной суммой price по этому дню и долю от общего price по дню.
Начал как всегда с запросов по отдельности. Вот вывод по каждому name суммы price по каждому дню:
Код: sql
1.
SELECT name, strftime('%Y-%m-%d', date) AS data, sum(price) AS summa FROM A INNER JOIN B ON B.a_id = A.id GROUP BY name, data


Вот вывод суммы price по дню:
Код: sql
1.
SELECT strftime('%Y-%m-%d', date) AS data, sum(price) as maxsumma FROM A INNER JOIN B ON B.a_id = A.id GROUP BY data


Уже смущает только одно то, что запросы очень схожи (в первом еще есть только доп. группировка по name).
Далее пытаюсь объединить эти части, еще вычисляя максимум по price от первого запроса (чтобы вышло как в задании). Но вышло как-то очень криво...
Код: sql
1.
2.
3.
4.
5.
6.
SELECT name, data1, max(summa), maxsumma, max(summa)/maxsumma*100 FROM
(SELECT name, strftime('%Y-%m', date) AS data1, sum(price) AS summa FROM A INNER 
JOIN B ON B.a_id = A.id GROUP BY name, data1) INNER JOIN
(SELECT strftime('%Y-%m', date) AS data2, sum(price) as maxsumma FROM A INNER 
JOIN B ON B.a_id = A.id GROUP BY data2) ON data1 = data2
GROUP BY data1


Кучу всего внутри схоже и пересекается, но никак не могу догнать, как это проще написать и возможно ли как-то объединить?
Заранее признателен за любую помощь
...
Рейтинг: 0 / 0
11.05.2017, 14:42
    #39451401
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
gammaray,

Если есть исходные данные, предоставьте и результат, который должен быть в итоге, по этим данным
...
Рейтинг: 0 / 0
11.05.2017, 15:28
    #39451447
gammaray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
VSVLAD, ну, например,
Таблица A
id name1 "A1"2 "A2"
Таблица B
id a_id date price1 1 10.05.2017 1002 2 10.05.2017 2003 1 11.05.2017 1004 2 11.05.2017 2005 1 11.05.2017 1006 1 11.05.2017 100
Результат по дням
date name name_price_sum all_price_sum percent10.05.2017 "A2" 200 300 200/300*100 = 66.6%11.05.2017 "A1" 300 500 300/500*100 = 60.0%

P.S. В первом посте в объединенном запросе ошибся - везде формат времени ко дню strftime('%Y-%m -%d ', date)
...
Рейтинг: 0 / 0
11.05.2017, 17:00
    #39451515
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
gammaray,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with b_grp as (
     select strftime('%Y-%m-%d', date) dt, a_id, sum(price) price
     from b
     group by strftime('%Y-%m-%d', date), a_id     

) select b_grp.dt, name, mx_name_price, price_all, mx_name_price / price_all * 100
  from b_grp  
  inner join a on a.id = b_grp.a_id
  inner join ( select dt, max(price) mx_name_price, sum(price) price_all
               from b_grp              
               group by dt ) b_grp2  on b_grp2.dt = b_grp.dt
                                    and b_grp2.mx_name_price = b_grp.price



* Подзапрос b_grp - вынужденная группировка, т.к. в один день может быть несколько прайсов на один и тот же нейм
* Подзапрос b_grp2 - группируем по дню максимальную цену и сумму всех цен, потом связывая максимальную цену с основной таблицей, узнаём имя того продукта, который имел эту цену.

В вашем запросе "SELECT name, data1 ..." ... "GROUP BY data1", отсутствует группировка по имени, хотя по правилам она требуется, раз перечислено в селекте... но SQLite не считает это ошибкой и похоже берёт "первое" значение у даты
...
Рейтинг: 0 / 0
11.05.2017, 21:40
    #39451674
gammaray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
VSVLADВ вашем запросе "SELECT name, data1 ..." ... "GROUP BY data1", отсутствует группировка по имени, хотя по правилам она требуется, раз перечислено в селекте... но SQLite не считает это ошибкой и похоже берёт "первое" значение у даты
Первую часть буду "вкуривать" уже видимо завтра на свежую голову, но по этой части не понял. Там же есть группировка и по name, и по date1.
Правильно я понял, что у Вас логика примерно такая же, как у меня. Тоже отдельно смотрим показатели по дням и именам, отдельно по сумме по дням, потом берем максимум от первого и связываем по дате со вторым для получения нужного значения для вычисления пропорции?
Я честно говоря давно не брал в руки скул, но уж очень смущает количество "похожих" конструкций. Так и хочется, вспоминая алгебру логик, как-то упростить это выражение....
...
Рейтинг: 0 / 0
11.05.2017, 23:00
    #39451695
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на вычисление процента
gammarayЯ честно говоря давно не брал в руки скул, но уж очень смущает количество "похожих" конструкций.Для этого и придуман синтаксис WITH.

gammarayТак и хочется, вспоминая алгебру логик, как-то упростить это выражение....Надо не алегбру логики вспоминать а реляционную алгебру.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Запрос на вычисление процента / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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