两列

时间:2015-09-22 15:41:11

标签: sql sql-server group-by jointable

我试图加入两个表,但是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

2 个答案:

答案 0 :(得分:1)

显然,您只想加入同一emp_id 相同scheme_id的行。这在外连接中是可能的,就像在内连接中一样。我推断您还要合并两个表中的emp_idscheme_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_idscheme_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