我试图加入两个表,但是emp_id和scheme_id列可能为空或者没有在任何一个表中填充,但是如果它填充在任一个表中,那么我需要为每个方案返回该员工的总pen_ee(下面的进一步表格说明)。我无法编辑表结构,必须使用我的工作。
我一直试图使用完整的联接来执行此操作但不明白您是否可以在两个字段上进行完全联接emp_id& scheme_id来获得所需的结果。
表PAYAUDPEN
这是今年头两个月
- 员工A给予BMAL方案44.06
- 员工B已将98.06给予BMAL方案
- 员工B给出了98.06计划CLFL。
emp_id, period_id, scheme_id, pen_ee
A, 201601, BMAL, 22.03
A, 201602, BMAL, 22.03
B, 201601, BMAL, 98.06
B, 201602, CLFL, 98.06
表PAYISPEN
这是第三个&一年中的当前月份。系统始终将当前月份放入此表中。
- 员工A给了22.03
- 员工B给出98.06
(注意员工B在第3个月再次没有为BMAL计划做出贡献,这是该问题的一部分。)
emp_id, scheme_id, pen_ee
A, BMAL, 22.03
B, CLFL, 98.06
必填结果 SQL语句需要返回为他们贡献的每个方案的每个员工一起添加的3个期间 - 计划BMAL的员工A为44.06 + 22.03 = 66.09 - 方案BMAL的员工B为98.06 + NULL = 98.06 - 计划CLFL的员工B为98.06 + 98.06 = 196.12。
A, BMAL, 66.09
B, BMAL, 98.06
B, CLFL, 196.12
要创建两个表的基础知识并使用上面的示例数据填充,请运行以下查询。
CREATE TABLE [dbo].[payaudpen](
[emp_id] [char](10) NOT NULL,
[period_id] [char](6) NOT NULL,
[scheme_id] [char](10) NOT NULL,
[pen_ee] [numeric](15, 2) NULL)
CREATE TABLE [dbo].[payispen](
[emp_id] [char](10) NOT NULL,
[scheme_id] [char](10) NOT NULL,
[pen_ee] [numeric](15, 2) NULL )
INSERT INTO payaudpen VALUES ('A','201601','BMAL','22.03'), ('A','201602','BMAL','22.03'), ('B','201601','BMAL','98.06'), ('B','201602','CLFL','98.06')
INSERT INTO payispen VALUES ('A','BMAL','22.03'), ('B','CLFL','98.06')
我当前使用的陈述:
SELECT a.emp_id,
a.scheme_id,
SUM(a.pen_ee)+AVG(b.pen_ee)
FROM payaudpen a
FULL JOIN payispen b
ON a.emp_id=b.emp_id
GROUP BY a.scheme_id, a.emp_id
结果不正确
对于每个方案,不会为员工B返回正确的值。
A, BMAL, 66.09
B, BMAL, 196.12
B, CLFL, 196.12
答案 0 :(得分:1)
显然,您只想加入同一emp_id
和相同scheme_id
的行。这在外连接中是可能的,就像在内连接中一样。我推断您还要合并两个表中的emp_id
和scheme_id
列,以便在a
不提供时,它们来自b
。这样就可以了:
SELECT
COALESCE(a.emp_id, b.emp_id) AS emp_id,
COALESCE(a.scheme_id, b.scheme_id) AS scheme_id,
SUM(a.pen_ee)+AVG(b.pen_ee) AS pen_ee
FROM
payaudpen a
FULL JOIN payispen b
ON a.emp_id = b.emp_id AND a.scheme_id = b.scheme_id
WHERE
COALESCE(a.emp_id, b.emp_id) in ('A','B')
AND (a.period_id IS NULL OR a.period_id in ('201601','201602'))
GROUP BY COALESCE(a.scheme_id, b.scheme_id), COALESCE(a.emp_id, b.emp_id)
请注意使用COALESCE()
来处理表a
未提供emp_id
或scheme_id
的情况;使用SQL Server,您也可以使用ISNULL()
。另请注意a.period_id IS NULL
条件中WHERE
的容差 - 这是必要的(与COALESCE()
一起使用)以包含来自b
行但没有相应的数据a
行。
答案 1 :(得分:1)
您试图对两个表进行求和,使用union all将表与更多行建立成一个关系,而不是使用join来使表与更多列成关系:
WITH all_records AS (SELECT emp_id
, scheme_id
, pen_ee
FROM payispen
UNION ALL
SELECT emp_id
, scheme_id
, pen_ee FROM payaudpen)
SELECT emp_id, scheme_id, SUM(pen_ee)
FROM all_records
GROUP BY emp_id, scheme_id
结果:
emp_id scheme_id (No column name)
A BMAL 66.09
B BMAL 98.06
B CLFL 196.12