如何在不重复行的情况下追加来自其他表的具有匹配ID的数据?

时间:2018-07-16 19:03:00

标签: sql sql-server tsql

我正在尝试从一个表中提取数据以添加到现有查询中。本质上,我只想带出PM和Supt名称,并将它们添加到具有相应员工ID的行中。下图中的表1和表2是我试图从中“合并”数据的2个表的示例,而表3是我希望得到的结果。

Table 1:
+--------+----------+
| Emp_ID | Emp_Name |
+--------+----------+
| 1111   | Bob      |
+--------+----------+
| 2222   | Joe      |
+--------+----------+

Table 2:
+------+------+
| PM   | Supt |
+------+------+
| 1111 | 2222 |
+------+------+
| 1111 | 3333 |
+------+------+

Table 3 (Expected Result):
+------+------+---------+-----------+
| PM   | Supt | PM_Name | Supt_Name |
+------+------+---------+-----------+
| 1111 | 2222 | Bob     | Joe       |
+------+------+---------+-----------+
| 1111 |      | Bob     | NULL      |
+------+------+---------+-----------+

到目前为止,我已经能够通过左联接和case语句使员工姓名显示在正确的字段中,但是我得到了重复的行(每个名称实例一个)。我还包括了当前代码和示例结果集,以供参考。

    SELECT 
                     JUDF.Job_Number, JUDF.User_Def_Sequence, JUDF.Date_Field, JUDF.Company_Code, JUDF.Alpha_Field, JM.Original_Contract, JM2.Revised_Contract, JM.Job_Description, JM.Project_Manager, JM.Superintendent, 
                     (CASE WHEN LTRIM(RTRIM(JM.Project_Manager)) = LTRIM(RTRIM(ECL.Employee_Code)) THEN ECL.Employee_Name END) AS PM_Name, (CASE WHEN LTRIM(RTRIM(JM.Superintendent)) = LTRIM(RTRIM(ECL.Employee_Code)) 
                     THEN ECL.Employee_Name END) AS Supt_Name
    FROM            dbo.JC_JOB_MASTER_MC AS JM INNER JOIN
                     dbo.JC_JOB_USER_FIELDS_DET_MC AS JUDF WITH (NOLOCK) ON JM.Company_Code = JUDF.Company_Code AND JM.Job_Number = JUDF.Job_Number INNER JOIN
                     dbo.JC_JOB_MASTER2_MC AS JM2 WITH (NOLOCK) ON JM.Company_Code = JM2.Company_Code AND JM.Job_Number = JM2.Job_Number LEFT OUTER JOIN
                     dbo.Z_EMPLOYEE_CODE_LIST AS ECL WITH (NOLOCK) ON LTRIM(RTRIM(JM.Project_Manager)) = LTRIM(RTRIM(ECL.Employee_Code)) OR
                     LTRIM(RTRIM(JM.Superintendent)) = LTRIM(RTRIM(ECL.Employee_Code))

+------------+--------------+------------+--------------+-------------+-------------------+------------------+-----------------+-----------------+----------------+---------+-----------+
| Job_Number | User_Def_Seq | Date_Field | Company_Code | Alpha_Field | Original_Contract | Revised_Contract | Job_Description | Project_Manager | Superintendent | PM_Name | Supt_Name |
+------------+--------------+------------+--------------+-------------+-------------------+------------------+-----------------+-----------------+----------------+---------+-----------+
| 12345      | 001          | NULL       | ABC          | NULL        | 12345             | 12345            | Test            | 1111            | 2222           | Bob     | NULL      |
+------------+--------------+------------+--------------+-------------+-------------------+------------------+-----------------+-----------------+----------------+---------+-----------+
| 12345      | 001          | NULL       | ABC          | NULL        | 12345             | 12345            | Test            | 1111            | 2222           | NULL    | Joe       |
+------------+--------------+------------+--------------+-------------+-------------------+------------------+-----------------+-----------------+----------------+---------+-----------+

3 个答案:

答案 0 :(得分:0)

您需要两次加入ECL表。一次用于PM,一次用于SUPTS。尝试对OR使用单个联接将导致重复的行带有NULL。

答案 1 :(得分:0)

    SELECT  ID
            ,MONTH(TransactionDate) AS Month
            ,SUM(Amount) AS Amount
    FROM Table1
    WHERE TransactionDate BETWEEN '20170101' AND '20171231'
    GROUP BY ID, Month
    HAVING MIN(Amount) > 0
    ORDER BY ID, Month
    ;
  

从table2 c左连接中选择a.empid,b.empid,a.empname和b.empnam   pm = a.empid上的table1 a左连接supt = b.empid上的table2 b

答案 2 :(得分:0)

def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)