计算具有特定值的记录数并映射到其他表

时间:2019-07-18 15:44:29

标签: sql sql-server

我有3张桌子

  1. parent_company
  2. 公司
  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

在此先感谢您的帮助!

2 个答案:

答案 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