【问题标题】:Deleting the row from table 2 that exist in table 1 and add these extra rows to table1从表 2 中删除表 1 中存在的行并将这些额外的行添加到表 1
【发布时间】:2021-02-12 19:47:57
【问题描述】:

所以我写了这个查询。我想获取不在第一个数据集中的空数据。

第一次查询返回 34 个用户
第二次查询返回 43 个用户
我需要将额外的 10 个用户添加到第一个

select projects_users_duration.user_id,
       projects_users_duration.engineer_name,
       COALESCE(sum(projects_users_duration.duration) FILTER ( WHERE projects_users_duration.project_type = 1 ), 0) as billed,
       COALESCE(sum(projects_users_duration.duration) FILTER ( WHERE projects_users_duration.project_type != 1 ), 0) as un_billed
    from
(select users_in_team.user_id, users_in_team.engineer_name, tt.month, tt.year, t.duration,
       (select up.project_type_id from users_project up where id = tt.project_id) as project_type
from (select uu.id as user_id, pgp_sym_decrypt(uu.name, '1234') as engineer_name
      from users_team_members as utm
               left join users_user uu on uu.id = utm.user_id
      where utm.team_id in (1, 2)) as users_in_team
         left join timetracker_timesheet tt on users_in_team.user_id = tt.user_id
         left join timetracker_timesheetentry t on tt.id = t.timesheet_id
where tt.month in (1)
  and tt.year = 2021
  and tt.status = 'approved') as projects_users_duration
group by projects_users_duration.user_id, projects_users_duration.engineer_name
select uu.id as user_id, pgp_sym_decrypt(uu.name, '1234') as engineer_name, 0 as billed, 0 as un_billed
      from users_team_members as utm
               left join users_user uu on uu.id = utm.user_id
      where utm.team_id in (1, 2)

第一个数据集也应该包含空数据,但我认为这是因为 where 子句。

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

    要从第二个查询中获取第一个查询中不可用的所有行:

    with cte as(select projects_users_duration.user_id,
           projects_users_duration.engineer_name,
           COALESCE(sum(projects_users_duration.duration) FILTER ( WHERE projects_users_duration.project_type = 1 ), 0) as billed,
           COALESCE(sum(projects_users_duration.duration) FILTER ( WHERE projects_users_duration.project_type != 1 ), 0) as un_billed
        from
    (select users_in_team.user_id, users_in_team.engineer_name, tt.month, tt.year, t.duration,
           (select up.project_type_id from users_project up where id = tt.project_id) as project_type
    from (select uu.id as user_id, pgp_sym_decrypt(uu.name, '1234') as engineer_name
          from users_team_members as utm
                   left join users_user uu on uu.id = utm.user_id
          where utm.team_id in (1, 2)) as users_in_team
             left join timetracker_timesheet tt on users_in_team.user_id = tt.user_id
             left join timetracker_timesheetentry t on tt.id = t.timesheet_id
    where tt.month in (1)
      and tt.year = 2021
      and tt.status = 'approved') as projects_users_duration
    group by projects_users_duration.user_id, projects_users_duration.engineer_name)
    
    select uu.id as user_id, pgp_sym_decrypt(uu.name, '1234') as engineer_name, 0 as billed, 0 as un_billed
          from users_team_members as u
    

    tm left join users_user uu on uu.id = utm.user_id 其中 utm.team_id 在 (1, 2) 而 uu.id 不在(从 cte 中选择 user_id)

    现在您可以在任何表中插入这些行,也可以根据需要删除它们。

    【讨论】:

    • 我使用 with 解决了这个问题,谢谢。但上述方法只给了我表 2 的额外内容。
    • 很高兴知道您的问题已经解决。最美好的祝愿
    【解决方案2】:
    with team_members as (
        select uu.id                                                as user_id,
               pgp_sym_decrypt(uu.name, '12345') as engineer_name,
               0                                                    as billed,
               0                                                    as un_billed,
               0                                                    as total
        from users_team_members as utm
                 left join users_user uu on uu.id = utm.user_id
        where utm.team_id in (1, 2)
          and (uu.end_date is null or uu.end_date > now())
        group by uu.id
    ),
         individual_data as (
             select projects_users_duration.user_id,
                    projects_users_duration.engineer_name,
                    COALESCE(sum(projects_users_duration.duration)
                             FILTER ( WHERE projects_users_duration.project_type = 1 ), 0)
                                                          as billed,
                    COALESCE(sum(projects_users_duration.duration)
                             FILTER ( WHERE projects_users_duration.project_type != 1 ), 0)
                                                          as unbilled,
                    sum(projects_users_duration.duration) as total
             from (select users_in_team.user_id,
                          users_in_team.engineer_name,
                          tt.month,
                          tt.year,
                          t.duration,
                          (select up.project_type_id from users_project up where id = tt.project_id) as project_type
                   from team_members as users_in_team
                            left join timetracker_timesheet tt on users_in_team.user_id = tt.user_id
                            left join timetracker_timesheetentry t on tt.id = t.timesheet_id
                   where tt.month in (1, 2, 3)
                     and tt.year = 2021
                     and tt.status in ('approved')) as projects_users_duration
             group by projects_users_duration.user_id, projects_users_duration.engineer_name
         )
    
        (select *
         from team_members
         where user_id not in (select user_id from individual_data)
         union
         select *
         from individual_data) order by total desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2012-03-26
      • 2021-06-08
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多