【问题标题】:How to Combine Columns in SQL?如何在 SQL 中合并列?
【发布时间】:2021-02-09 15:41:26
【问题描述】:

我试图在使用联接时合并两个表结果而不重复/增加值。 (公司和团队他们有来自彼此表的 id)

我正在尝试计算支持一个国家/地区的团队数量。 以及支持一个国家的公司的数量。

表格与此类似。

companies | country
----------+--------
one       | USA
two       | CAN
tree      | USA
four      | MEX

输出将是每个国家的支持者数量。

country | company_no_supp
--------+----------------
USA     | 2
CAN     | 1
MEX     | 1

现在我会为团队做同样的事情。

team    | country
--------+----------
t1      | CAN
t2      | CAN
t3      | CAN
t4      | MEX
t5      | MEX
t6      | USA
t7      | USA
t8      | USA

结果:

country | team_no_supp
--------+-----------
USA     | 3
CAN     | 3
MEX     | 2

我想做的是将两个结果合二为一,并保留 team_no_supp 和 country_no_supp。

喜欢:

country | team_no_supp | companies_no_supp
--------+--------------+-------------------
USA     | 3            | 2
CAN     | 3            | 1
MEX     | 2            | 1

我已经尝试过连接(各种)。但是我对 sql 的经验还不是很丰富。

【问题讨论】:

  • 发布你迄今为止尝试过的代码结果(为什么它们不是你想要的)
  • 请展示您的尝试...

标签: sql database oracle


【解决方案1】:

不要使用JOIN,除非你不需要用新的属性来丰富你的数据,你可以使用UNION:它更轻量级,在不需要大数据交换的情况下有更多的并行处理能力:

select
  country,
  count(team) as team_no_supp,
  count(company) as companies_no_supp
from (
  select
    country,
    company,
    null as team
  from companies

  union all

  select
    country,
    null as company,
    team as team
  from teams
)
group by country

db小提琴here

【讨论】:

  • 谢谢,我还没有学会如何在 from 上创建子查询。这非常有用。
【解决方案2】:

试试下面的查询

 SELECT TabAuxA.country,
        team_no_supp,
       company_no_supp  FROM  (SELECT country, COUNT(*) as company_no_supp
   FROM table1
  GROUP BY country ) as TabAuxA
  INNER JOIN  (SELECT country, COUNT(*) as team_no_supp
     FROM table2
  GROUP BY country ) as TabAuxB ON TabAuxA.country = TabAuxB.country

OBS: 不要忘记将表名(table1 和 table2)替换为您正在使用的表

【讨论】:

    【解决方案3】:

    在 from 子句中使用子查询:

    select c.country, c.company_no_supp, t.teams_no_supp from 
    (select country, count(*) company_no_supp from @companies group by country) c
    join 
    (select country, count(*) teams_no_supp from @teams group by country) t on c.country = t.country
    

    【讨论】:

      【解决方案4】:

      问题是您可能在两张表中没有相同的国家/地区。我建议FULL JOIN

      select country, coalesce(cnt_a, 0) as cnt_a, 
             coalesce(team_no_supp, 0) as team_no_supp
      from (select country, count(*) as cnt_a
            from a
            group by country
           ) a full join
           b
           using (country);
      

      【讨论】:

        【解决方案5】:

        这是另一个解决方案,它也将涵盖并非所有国家/地区都出现在两个表中的情况:

        WITH companies (company, country)
        AS
        (
          SELECT 'one',  'USA' FROM DUAL UNION ALL
          SELECT 'two',  'CAN' FROM DUAL UNION ALL
          SELECT 'tree', 'USA' FROM DUAL UNION ALL
          SELECT 'four', 'MEX' FROM DUAL 
        ), teams (team, country) AS
        (
          SELECT 't1', 'CAN' FROM DUAL UNION ALL
          SELECT 't2', 'CAN' FROM DUAL UNION ALL
          SELECT 't3', 'CAN' FROM DUAL UNION ALL
          SELECT 't4', 'MEX' FROM DUAL UNION ALL
          SELECT 't5', 'MEX' FROM DUAL UNION ALL
          SELECT 't6', 'USA' FROM DUAL UNION ALL
          SELECT 't7', 'USA' FROM DUAL UNION ALL
          SELECT 't8', 'USA' FROM DUAL
        ), companies_cnt(country, cnt) AS
        (
          SELECT country, count(company) FROM companies
          GROUP BY country
        ), teams_cnt(country, cnt) AS
        (
          SELECT country, count(team) FROM teams
          GROUP BY country
        ), combined_data (country, t, c) AS
        (
          SELECT country, cnt, 0 FROM teams_cnt
          UNION ALL
          SELECT country, 0, cnt FROM companies_cnt
        )
        SELECT COUNTRY, MAX(t) as team_no_supp, MAX(c) as companies_no_supp from combined_data GROUP BY country;
        
        

        【讨论】:

          【解决方案6】:

          您可能希望在存在时使用合并,在不存在时使用插入更新,如下所示: 合并到员工中 使用 hr_records h 开(e.id = h.emp_id) 当匹配然后 更新集 e.address = h.address 当不匹配时 插入(ID,地址) 值(h.emp_id,h.address);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多