извлекать данные из базы данных наиболее продаваемых продуктов по отраслям - PullRequest
0 голосов
/ 17 апреля 2020

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

Вот схема моей базы данных:

enter image description here

Таблица DIM_SOUS_CAT является таблицей продуктов, и каждый продукт классифицируется по отраслям и категориям

Данные DIM_CAT:

enter image description here

DIM_BRANCHE data

enter image description here

Данные DIM_SOUS_CAT, являющиеся продуктом

enter image description here

Данные FAIT_VENTE, представляющие собой список продаж

enter image description here

Я написал sql запрос, но он не работает. вот запрос:

select vf.id_branche, vf.id_categorie, count(*) 
from vente_fact vf 
GROUP by vf.id_branche, vf.id_categorie  
HAVING count(*) = (  
   SELECT max(COUNT(*)) 
   FROM vente_fact vf2  
   GROUP by vf2.id_branche, vf2.id_categorie 
) 

любые предложения, пожалуйста!

1 Ответ

2 голосов
/ 17 апреля 2020

Вы почти у цели. Что касается вопроса, вам просто нужно исправить подзапрос:

  • он должен быть соотнесен с внешним запросом

  • , который вы не можете выражения совокупности гнезд, как MAX(COUNT(*)); для этого потребуется дополнительный уровень агрегации - вместо этого вы можете order by и limit

Я бы предложил:

select 
    vf.id_branche, 
    vf.id_categorie, 
    count(*) no_ventes
from vente_fact vf 
group by vf.id_branche, vf.id_categorie 
having count(*) = (
    select count(*) 
    from vente_fact vf2 
    where vf2.id_branche = vf1.id_branche
    order by count(*) desc
    limit 1 
)

Обратите внимание, что если вы работает MySQL 8.0, это более эффективно выполняется с помощью оконных функций:

select id_branche, id_categorie, no_ventes
from (
    select 
        id_branche, 
        id_categorie, 
        count(*) no_ventes,
        rank() over(partition by id_branche order by count(*) desc) rn
    from vente_fact vf 
    group by id_branche, id_categorie 
) t
where rn = 1
...