Как рассчитать среднее количество заказанных услуг на заказ с уникальной ссылкой на пользователя?(Баз данных) - PullRequest
0 голосов
/ 23 сентября 2019

Я думаю, что мой вопрос больше относится к математике, чем к MySQL.

Размещенный заказ может принадлежать одному из трех возможных сервисов (например, A, B, C).Пользователь для бывшего.100 размещенных заказов (например, 30 услуг A, 40 услуг B и 30 услуг C).И размещенный заказ имеет ссылку на свойство (некоторые заказы принадлежат одной и той же ссылке на свойства, а некоторые нет).

Мне нужно рассчитать " Среднее количество заказанных заказов на листинг (уникальная ссылка на свойство)" дляодин конкретный пользователь.Это значение будет от 0 до 3 (например, 1.4).

Например, если пользователь заказал 3 заказа для ссылки «Свойство X» (и не заказал для других свойств), и это были заказы для услуги A, служба A и служба C - среднее значение будет 2 (он заказал 2 типа услуг для одной и той же ссылки на свойство).

Пример данных:

CREATE TABLE IF NOT EXISTS `orders` (
`id` int(6) NOT NULL,
`user_id` int(6) NOT NULL,
`reference` varchar(64) NOT NULL,
`service_type` varchar(16) NOT NULL
);
INSERT INTO `orders` (`id`, `user_id`, `reference`, `service_type`) VALUES
('4', '66', 'Blue house',  'serviceA'),
('2', '66', 'Blue house',  'serviceB'),
('5', '66', 'Blue house',  'serviceB'),
('6', '66', 'Blue house',  'serviceC'),
('1', '66', 'Red house',   'serviceA'),
('3', '66', 'Red house',   'serviceA'),
('7', '66', 'Green house', 'serviceC')

В этом примере: Пользователь заказал 3 уникальные услуги для справки «Голубой дом», 1 уникальную услугу для «Красного дома» и 1 уникальную услугу для справки «Зеленый дом».Мне нужно знать среднее количество заказанных услуг для каждого уникального списка (не для каждого списка, среднее для всего - только ОДНО значение для всех этих данных).Таким образом, у нас есть 3 уникальные ссылки для пользователя (синий, красный, зеленый дома) и мы знаем, сколько уникальных сервисов назначил каждая ссылка.Как получить среднее значение?

Ожидаемый результат, который мне нужен из расчета: ОДНО значение, что-то вроде 1,7 (я не знаю реального значения из этого примера, потому что я не знаю, какрассчитать это математически).Это означает, что пользователь заказал 1,7 (из 3 доступных) сервисов для уникальной ссылки на свойство в среднем в течение всего периода во всех заказах.

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

Например, получение количества заказов с уникальными ссылками на заказы (3 вмой пример ниже):

SELECT COUNT(distinct reference) as total_orders FROM orders WHERE user_id = 66;

Но я не понимаю, что делать дальше.

Пример данных: http://sqlfiddle.com/#!9/dd00d7

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Если я правильно понимаю, вам нужно два уровня GROUP BY.На внутреннем уровне вам нужно количество отдельных услуг в списке (синий дом = 3, красный дом = 1, зеленый = 1).На внешнем уровне вы рассчитываете среднее значение 3, 1, 1:

SELECT userid, AVG(service_type_count) AS avg_service_type_per_listing
FROM (
    SELECT userid, reference, COUNT(DISTINCT service_type) AS service_type_count
    FROM orders
    GROUP BY userid, reference
) AS x
GROUP BY userid
0 голосов
/ 23 сентября 2019

Вот предположение, где подзапрос идентифицирует отдельный сервис по пользователю и ссылке, а внешний запрос вычисляет среднее значение.

drop table if exists t;

CREATE TABLE t (
  `id` int(6) NOT NULL,
  `userid` int(6) NOT NULL,
  `reference` varchar(64) NOT NULL,
  `service_type` varchar(16) NOT NULL
);
INSERT INTO t (`id`, `userid`, `reference`, `service_type`) VALUES
  ('1', '66', 'Red house', 'serviceA'),
  ('2', '66', 'Blue house', 'serviceB'),
  ('3', '66', 'Red house', 'serviceA'),
  ('4', '66', 'Blue house', 'serviceA'),
  ('5', '66', 'Blue house', 'serviceB'),
  ('6', '66', 'Blue house', 'serviceC'),
  ('7', '66', 'Green house', 'serviceC');

select s.userid,
        sum(s.distinctservice_types) distinctservice_types,
        sum(s.distinctservice_types) / 3 avgs
from
(
select userid,reference,count(Service_type) countservice_types,
         count(distinct service_type) distinctservice_types
from t
group by userid,reference
) s
group by s.userid
;

+--------+-----------------------+--------+
| userid | distinctservice_types | avgs   |
+--------+-----------------------+--------+
|     66 |                     5 | 1.6667 |
+--------+-----------------------+--------+
1 row in set (0.00 sec)
...