【问题标题】:Distict values from 2 tables combined with aggregating sums from the same two tables来自 2 个表的不同值与来自相同两个表的汇总总和相结合
【发布时间】:2015-10-30 13:31:20
【问题描述】:

我想做以下事情:

  • 从表 A 和 B 中获取不同的姓名和年龄。
  • 然后我想从表A和表B中为每组姓名和年龄总结工资。我希望输出显示:姓名、年龄、(sum Table A)、(sum Table B)、(sum Table A-sum Table B)

请看下面的例子:

表 A:

  1. 姓名=Al,年龄=20,薪水=10
  2. 姓名=Al,年龄=20,薪水=20
  3. 姓名=鲍勃,年龄=22,工资=25

表 B

  1. 姓名=Al,年龄=20,薪水=30
  2. 姓名=Al,年龄=20,薪水=40
  3. 姓名=鲍勃,年龄=22,薪水=35

预期输出:

  1. 姓名=Al,年龄=20,SalaryA=30,SalaryB=70,差异=-40
  2. 姓名=Bob,年龄=22,SalaryA=25,SalaryB=35,差异=-10

如何在 SQL 中编写此代码?我使用 Teradata。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您可以只使用group by 并使用union all 组合来自tableA 和tableB 的查询结果。

     select name, age, max(salaryA), max(salaryB), max(salaryA) - max(salaryB) as difference
     from (
     select name, age, sum(salary) as salaryA, null as salaryB
     from tablea 
     group by name, age
     union all
     select name, age, null as salaryA, sum(salary) as salaryB
     from tableb 
     group by name, age) t
     group by name, age
    

    【讨论】:

    • 我喜欢你的解决方案,但我第一次看到它不明白为什么MAX() 也没有看到NULL。也许把null 大写或者我需要新眼镜?
    【解决方案2】:
     SELECT A.name, A.age, A.SalaryA, B.SalaryB, A.SalaryA - B.SalaryB as difference
     FROM (
          SELECT name, age, SUM(Salary) as SalaryA
          FROM TableA
          GROUP BY name, age
          ) as A
    INNER JOIN 
          (
          SELECT name, age, SUM(Salary) as SalaryB
          FROM TableB
          GROUP BY name, age 
          ) as B
     ON A.name = B.name
    AND A.age  = B.age
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多