Аккуратный способ расчета о: сгруппировать по внутренней группе по - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть некоторые данные о покупках. Хотелось бы увидеть: сгруппировать по merchant, какое среднее количество различных продуктов на клиента ?

Это мой код

CREATE TABLE purchases (
    id int IDENTITY,
    merchant varchar(50) NOT NULL,
    customer VARCHAR(50) NOT NULL,
    product VARCHAR(50) NOT NULL,
    amount money
);

INSERT INTO purchases (merchant, customer, product, amount) 
VALUES 
    ('apple', 'John', 'iphone', 100),
    ('apple', 'John', 'macbook', 100),
    ('apple', 'Jessi', 'iphone', 100),
    ('microsoft', 'John', 'surface laptop', 100),
    ('microsoft', 'John', 'surface book', 100),
    ('microsoft', 'Jessi', 'surface book', 100)

-- I can do it with two layers of group by
select merchant
    , avg(cast(ct_product as float)) as avg_number_products_per_customer
from (
    select merchant
        , customer
        , count(distinct product) as ct_product
    from purchases
    group by merchant, customer
) as a
group by merchant

Я могу сделать это с двумя слоями group by, как указано выше, но в идеале мне нужен только один основной group by, чтобы код выглядел аккуратно, а также я мог бы сложить вместе другие sum / avg, например:

select merchant
    , count(distinct customer) as count_customers
    , avg (amount) as avg_amount
    , ??? as avg_number_products_per_customer
from purchases
group by merchant

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш запрос действительно лучший подход. Я бы написал так:

select merchant, avg(ct_product * 1.0) as avg_number_products_per_customer
from (select merchant, customer,
            count(distinct product) as ct_product
      from purchases
      group by merchant, customer
     ) mc
group by merchant;

Вы также можете сделать расчет как:

select merchant,
       count(distinct concat(customer, ':', product)) / count(distinct customer)
from purchases
group by merchant;
...