我不知道如何优化此查询,也没有找到类似的查询作为示例。
重写此查询的最佳方法是什么,以便在 select 子句中没有这么多子查询,以实现按月/品牌 ID 分组的相同结果?
DBMS 是 SQL Server。
select
o.brand_id,
count(o.item_id) as "Total bought items",
count(o.sell_date) as "Total sold items",
/* Amount of sold items grouped by month per item */
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 1 and obj.brand_id = b.brand_id) as "Jan",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 2 and obj.brand_id = b.brand_id) as "Feb",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 3 and obj.brand_id = b.brand_id) as "Mar",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 4 and obj.brand_id = b.brand_id) as "Apr",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 5 and obj.brand_id = b.brand_id) as "May",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 6 and obj.brand_id = b.brand_id) as "Jun",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 7 and obj.brand_id = b.brand_id) as "Jul",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 8 and obj.brand_id = b.brand_id) as "Aug",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 9 and obj.brand_id = b.brand_id) as "Sep",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 10 and obj.brand_id = b.brand_id) as "Oct",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 11 and obj.brand_id = b.brand_id) as "Nov",
(select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 12 and obj.brand_id = b.brand_id) as "Dec"
from tab_brand as b
left join tab_object as o on b.brand_id = o.brand_id
and year(o.sell_date) = 2012
where b.brand_id in (1234, 1324, 1423, 2314)
group by b.brand_id
order by b.brand_id;