我有3张桌子
parent_company包含以下相关列:
parent_company_id total_num active_num
公司包含以下相关列:
company_id parent_company_id
注意:许多company_id可以指向同一个parent_company_id
main包含以下相关列:
company_id current_status
total_num表示主表中存在的company_id总数(指向相同的parent_company_id)。 active_num是相同的,给定额外条件,它们的状态必须为“活动”。
最初,我是使用pandas在python中完成此操作的,但是现在我希望在SQL中执行此操作,以查看我正在尝试完全切除python。
给出以下公司和主要表格
公司:
company_id parent_company_id
468 1
785 1
781 1
213 2
896 3
主要:
company_id current_status
781 Inactive
468 Active
785 Active
468 Inactive
781 Active
785 Active
213 Inactive
896 Active
我希望parent_company表看起来像这样:
父公司:
parent_company_id total_num active_num
1 6 4
2 1 0
3 1 1
在此先感谢您的帮助!
答案 0 :(得分:1)
这应该做到:
UPDATE p
SET p.total_num=n.total_num,
p.active_num=n.active_num
FROM parent_company p
INNER JOIN (
SELECT c.parent_company_id,
COUNT(*) AS total_num,
SUM(CASE WHEN m.status='Active' THEN 1 ELSE 0 END) AS active_num
FROM company c
INNER JOIN main m
ON c.company_id=m.company_id
GROUP BY c.parent_company_id) n
ON n.parent_company_id=p.parent_company_id;
答案 1 :(得分:1)
只需将company_id
上的两个表连接在一起:第一个计数将为您提供总数,然后只需检查curent_status
并创建总数:)
declare @company as table (
company_id int
,parent_company_id int
);
insert into @company values
(468, 1)
,(785, 1)
,(781, 1)
,(213, 2)
,(896, 3);
declare @main as table (
company_id int
,curent_status varchar(1)
);
insert into @main values
(781, 'I')
,(468, 'A')
,(785, 'A')
,(468, 'I')
,(781, 'A')
,(785, 'A')
,(213, 'I')
,(896, 'A')
select
c.parent_company_id
,count(c.company_id) as total_num
,SUM(case when m.curent_status = 'A' then 1 else 0 end) as active_num
from @company c
inner join @main m
on c.company_id = m.company_id
group by c.parent_company_id