如何从一个表中选择所有条目,并求和另一个表的子集

时间:2019-01-23 11:47:41

标签: sql-server

我有一个更大的数据库,其中包含员工输入的Times。他们参加了一项活动,活动的时间,花费的时间以及顾客。

我现在正试图返回一张包含所有员工的表,以总结他们的时间,但前提是该时间是为部分客户设置的。我可以得到一张带有“正确时间”的表,但是省略了没有输入任何时间的员工,或者我得到了所有员工,但是所有客户的总时间都是如此。

我的桌子是:

  • 员工的雇员
  • 所有活动的活动性
  • 客户的客户

要有一些“示例数据”:

| EMPLOYEE             |    | ACTIVITY                             |
+------------+---------+    +------------+------------+------------+
| I_EMPLOYEE | S_NAME1 |    | I_EMPLOYEE | I_CUSTOMER | N_DURETIME |
+------------+---------+    +------------+------------+------------+
|          1 | A       |    |          1 |          1 |          5 |
|          2 | B       |    |          2 |          3 |         10 |
|          3 | C       |    |          1 |          3 |         15 |
+------------+---------+    |          3 |          2 |         10 |
                            |          1 |          2 |         10 |
                            +------------+------------+------------+

除了客户2以外,我一直希望得到什么?

+----------+----------+
| EMPLOYEE | DURETIME |
+----------+----------+
|        1 |       20 |
|        2 |       10 |
|        3 |        - |
+----------+----------+

我得到这两个中的一个:

+----------+----------+    +----------+----------+
| EMPLOYEE | DURETIME |    | EMPLOYEE | DURETIME |
+----------+----------+    +----------+----------+
|        1 |       20 |    |        1 |       30 |
|        2 |       10 |    |        2 |       10 |
+----------+----------+    |        3 |       10 |
                           +----------+----------+

为了获得正确的时间,我使用以下命令:

SELECT emp.S_NAME1 AS Mitarbeiter, SUM(act.N_DURETIME)/60 as Zeit
FROM EMPLOYEE AS emp
LEFT JOIN ACTIVITY AS act on act.I_EMPLOYEE = emp.I_EMPLOYEE
LEFT JOIN CUSTOMER AS cust on cust.I_CUSTOMER = act.I_CUSTOMER
WHERE cust.CUSTNO NOT '2'

获取我使用过的员工的完整列表:

SELECT emp.S_NAME1 AS Mitarbeiter, SUM(act.N_DURETIME)/60 as Zeit
FROM EMPLOYEE AS emp
LEFT JOIN ACTIVITY AS act on act.I_EMPLOYEE = emp.I_EMPLOYEE
LEFT JOIN CUSTOMER AS cust on cust.I_CUSTOMER = act.I_CUSTOMER AND cust.CUSTNO NOT '2'

因此,根据我将“客户筛选器”放在JOIN还是WHERE语句中,我得到了正确表的一半。如何将它们结合起来以获得正确的输出?

2 个答案:

答案 0 :(得分:1)

Create Table #emp
(
i_emp Int,
s_name1 Char(1)
)
Insert Into #emp Values
(1,'A'),
(2,'B'),
(3,'C')

Create Table #Activity
(
i_emp Int,
i_cust Int,
n_duretime Int
)
Insert Into #Activity Values
(1,1,5),
(2,3,10),
(1,3,15),
(3,2,10),
(1,2,10)

查询

Select 
   e.i_emp, 
   Sum(Case When a.i_cust = 2 Then Null Else a.n_duretime End) As durationTot
From 
   #emp e Left Join
   #Activity a On e.i_emp = a.i_emp
Group By 
   e.i_emp

结果:

i_emp   durationTot
1       20
2       10
3       NULL

答案 1 :(得分:0)

您可以尝试以下查询

create table Employee(I_EMPLOYEE int, S_NAME1 char(1))
insert into Employee Values (1, 'A'),(2, 'B'),(3, 'C')

create table ACTIVITY (I_EMPLOYEE int, I_CUSTOMER int, N_DURETIME int)
insert into  ACTIVITY Values(1, 1, 5 ),( 2, 3, 10), (1, 3, 15), ( 3, 2, 10), ( 1 , 2 , 10 )

select EMPLOYEE, sum(isnull(DURETIME, 0)) as DURETIME from(
select EMPLOYEE.S_NAME1 as EMPLOYEE, case I_Customer when 2 then 0 else N_DURETIME end as DURETIME from activity
inner join Employee on activity.I_EMPLOYEE = Employee.I_EMPLOYEE
)a group by EMPLOYEE

下面是输出

I_EMPLOYEE  EMPLOYEE    DURETIME
--------------------------------
1            A          20
2            B          10
3            C           0