Sql server SQL Server如何在没有>&燃气轮机;导致从一次执行到另一次执行的总和发生变化

Sql server SQL Server如何在没有>&燃气轮机;导致从一次执行到另一次执行的总和发生变化,sql-server,tsql,Sql Server,Tsql,我有以下表格: CREATE TABLE [Hours]( [Activity Month] [datetime], [Employee_ID] [nvarchar](10), [Activity Date] [datetime], [Hours] [float] ) CREATE TABLE [Employee_IDs]( [Month] [datetime], [Employee_ID_1] [nvarchar](10), [Emp

我有以下表格:

CREATE TABLE [Hours](
    [Activity Month] [datetime],
    [Employee_ID] [nvarchar](10),
    [Activity Date] [datetime],
    [Hours] [float]
) 

CREATE TABLE [Employee_IDs](
    [Month] [datetime],
    [Employee_ID_1] [nvarchar](10),
    [Employee_ID_2] [nvarchar](10),
    [Employee_ID_3] [nvarchar](10),
    [Status] [nvarchar](10)
)
其中,[Employee_ID]可以等于表[Employee_ID]中的一个或多个ID:

[Employee_ID_1]=[Employee_ID_2]=[Employee_ID_3]
[Employee_ID_1]<>[Employee_ID_2]<>[Employee_ID_3]
[Employee_ID_1]=[Employee_ID_2]<>[Employee_ID_3]
[Employee_ID_1]<>[Employee_ID_2]=[Employee_ID_3]
试图从
表[Hours]
加入表
[Employee\u ID]
在所有3个可能的ID上识别所有
[Employee\u ID]
,而不重复导致不正确的
总和([Hours])

如果我将以下内容用作解决方案查询,则不存在重复项:

SELECT   [Employee_ID], [Activity Month], [Status] , SUM([Hours]) as Sum_Hours
FROM
(
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E1 ON H1.[Employee_ID] = E1.Employee_ID_1
    UNION 
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E2 ON H1.[Employee_ID] = E2.Employee_ID_2
    UNION 
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E3 ON H1.[Employee_ID] = E2.Employee_ID_3
    )T
 WHERE T.[Activity Month]=@Month
 GROUP BY  [Employee_ID], [Activity Month], [Status]
但是如果我尝试选择

SELECT   count(distinct [Employee_ID]) as HC, [Activity Month], [Status], SUM([Hours]) as Sum_Hours
FROM
(
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E1 ON H1.[Employee_ID] = E1.Employee_ID_1
    UNION 
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E2 ON H1.[Employee_ID] = E2.Employee_ID_2
    UNION 
    SELECT [Employee_ID], [Activity Month], [Status], [Hours] 
    FROM [Hours] H1
    INNER JOIN [Employee_IDs] E3 ON H1.[Employee_ID] = E2.Employee_ID_3
    )T
 WHERE T.[Activity Month]=@Month
 GROUP BY  [Activity Month], [Status]
然后,我面临着一个问题,即在数据表上不做任何更改的情况下,从一个执行到另一个执行的时间总和会有一些微小的变化

如果我将解决方案查询的结果插入表solution并运行:

SELECT count(distinct [Employee_ID]) as HC, [Activity Month], [Status], SUM([Hours]) as Sum_Hours FROM Solution Group By [Activity Month], [Status]
每次执行的总时数没有变化


您知道如何避免在解决方案查询中直接更改总和吗?

除非我遗漏了什么,否则在中使用一个简单的

select
    A.[Employee_ID], A.[Activity Month], B.[Status], Sum(A.[Hours])
from
    Hours A
    inner join Employee_IDs B on (A.Activity Month = @Month
                           and (A.Employee_ID = B.Employee_ID_1
                            or A.Employee_ID = B.Employee_ID_2
                           or A.Employee_ID = B.Employee_ID_3))
group by A.[Employee_ID], A.[Activity Month], B.[Status]
SELECT DISTINCT [Employee_ID], [Activity Month], [Status], Sum(H.[Hours]) 
FROM [Hours] H
INNER JOIN [Employee_IDs] E ON H.[Activity Month] = E.[Month]
                           AND H.[Employee_ID] IN([Employee_ID_1], [Employee_ID_2], [Employee_ID_3])
GROUP BY [Employee_ID], [Activity Month], [Status]

那么,所有3个员工ID字段是否都包含值?如果是,哪列是正确的,如果不是,那么COALESCE可能值得研究。Greate job posting DDL for sample tables,但是您的问题缺少DML for sample data以及期望的结果。此外,始终建议还包括产品版本标签(2008、2012等)它正在工作,但当Employee_ID_1=Employee_ID_2或Employee_ID_3或Employee_ID_1=Employee_ID_2=Employee_ID_3时,我们将有重复的结果。它正在工作,但当Employee_ID_1=Employee_ID_2或Employee_ID_2=Employee_ID_3或Employee_ID_1=Employee_ID_3或Employee_ID_1=Employee_3时,我们将有重复的结果将会有重复的结果。太好了!这解决了我的问题。
SELECT DISTINCT [Employee_ID], [Activity Month], [Status], Sum(H.[Hours]) 
FROM [Hours] H
INNER JOIN [Employee_IDs] E ON H.[Activity Month] = E.[Month]
                           AND H.[Employee_ID] IN([Employee_ID_1], [Employee_ID_2], [Employee_ID_3])
GROUP BY [Employee_ID], [Activity Month], [Status]