从数据库中检索数据,按分支机构列出最畅销的产品
retrieve data from a database the most sold products by branch
我正在尝试通过 Branch 在我的项目中获得最畅销的产品,但我不知道我的 Sql 查询有什么问题。
这是我的数据库的架构:
DIM_SOUS_CAT table 是产品 table 并且每个产品都按 Branch 和 Category 分类
DIM_CAT 数据:
DIM_BRANCHE数据
DIM_SOUS_CAT数据即产品
FAIT_VENTE数据,即销量榜单
我写了一个 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
)
有什么建议吗!
你快到了。至于问题,你只需要修复子查询:
需要关联外层查询
你不能嵌套聚合表达式,比如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,使用 window 函数可以更有效地完成此操作:
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
我正在尝试通过 Branch 在我的项目中获得最畅销的产品,但我不知道我的 Sql 查询有什么问题。
这是我的数据库的架构:
DIM_SOUS_CAT table 是产品 table 并且每个产品都按 Branch 和 Category 分类
DIM_CAT 数据:
DIM_BRANCHE数据
DIM_SOUS_CAT数据即产品
FAIT_VENTE数据,即销量榜单
我写了一个 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
)
有什么建议吗!
你快到了。至于问题,你只需要修复子查询:
需要关联外层查询
你不能嵌套聚合表达式,比如
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,使用 window 函数可以更有效地完成此操作:
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