联合查询,基于列的分组依据和子计数
Joined query, with group by and sub count based on a column
我有一个名为 products
的 table,我的查询从中检索不同的分组行,按 product_type_id 分组。
这是查询,有效
SELECT p.*, count(p.id) as count, pt.name from products p
LEFT JOIN product_types pt on pt.id = p.product_type_id
where client_id = 777
group by product_type_id
但是,这还不够,我想通过 activated
列(布尔类型)和 NOT-Activated 列进行子计数。
我想为每一行获取设置为 true 和设置为 false 的产品的子计数。我想将它们作为相关行中的另一列。
可能吗?
如果你想要一个单独的列,计数为activated
,那么你可以使用条件聚合:
select p.*, count(p.id) as count, pt.name,
SUM(activated) as numActivated,
(COUNT(*) - SUM(activated)) as numNotActivated
from products p left join
product_types pt
on pt.id = p.product_type_id
where client_id = 777
group by product_type_id;
MySQL 将布尔值视为数字上下文中的整数,1 表示真,0 表示假。因此,您只需添加值即可获得计数。
编辑:
如果您想要单独的行,请将其包含在 GROUP BY
:
select p.*, activated, count(p.id) as count, pt.name
from products p left join
product_types pt
on pt.id = p.product_type_id
where client_id = 777
group by product_type_id, activated;
如果您使用的是 BIT 列类型,您可能需要将其转换为整数。
我建议使用 CASE select 语句,或 subselect.
即
已激活
sum(CAST(activated as INT)) as TotalActivated
或
(select sum(CAST(activated as INT)) FROM products WHERE product_type_id = p.product_type_id) as TotalActivated
未激活
sum(case when activated = 1 then 0 else 1 end) as NotActivated
或
(select sum(case when activated = 1 then 0 else 1 end) FROM products WHERE product_type_id = p.product_type_id) as NotActivated
我有一个名为 products
的 table,我的查询从中检索不同的分组行,按 product_type_id 分组。
这是查询,有效
SELECT p.*, count(p.id) as count, pt.name from products p
LEFT JOIN product_types pt on pt.id = p.product_type_id
where client_id = 777
group by product_type_id
但是,这还不够,我想通过 activated
列(布尔类型)和 NOT-Activated 列进行子计数。
我想为每一行获取设置为 true 和设置为 false 的产品的子计数。我想将它们作为相关行中的另一列。
可能吗?
如果你想要一个单独的列,计数为activated
,那么你可以使用条件聚合:
select p.*, count(p.id) as count, pt.name,
SUM(activated) as numActivated,
(COUNT(*) - SUM(activated)) as numNotActivated
from products p left join
product_types pt
on pt.id = p.product_type_id
where client_id = 777
group by product_type_id;
MySQL 将布尔值视为数字上下文中的整数,1 表示真,0 表示假。因此,您只需添加值即可获得计数。
编辑:
如果您想要单独的行,请将其包含在 GROUP BY
:
select p.*, activated, count(p.id) as count, pt.name
from products p left join
product_types pt
on pt.id = p.product_type_id
where client_id = 777
group by product_type_id, activated;
如果您使用的是 BIT 列类型,您可能需要将其转换为整数。
我建议使用 CASE select 语句,或 subselect.
即
已激活
sum(CAST(activated as INT)) as TotalActivated
或
(select sum(CAST(activated as INT)) FROM products WHERE product_type_id = p.product_type_id) as TotalActivated
未激活
sum(case when activated = 1 then 0 else 1 end) as NotActivated
或
(select sum(case when activated = 1 then 0 else 1 end) FROM products WHERE product_type_id = p.product_type_id) as NotActivated