Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要帮助将第三个表连接到存储过程吗_Sql_Join - Fatal编程技术网

Sql 需要帮助将第三个表连接到存储过程吗

Sql 需要帮助将第三个表连接到存储过程吗,sql,join,Sql,Join,我有一个将两个表连接在一起的存储过程。我需要从原始SP中未包含的新表中添加一个新字段。我尝试的是为原始SP中父表的子记录中的每条记录从新表中添加一个字段。 我在一个测试查询中测试了基于父表的总和,结果很好: select totaldollars from TTS_EmpTime where emptimedaytotal_id='32878' 因此,下一步将是集成到SP中。我这样做了,并将SP的新部分设置为粗体,以便您可以看到添加了什么。如果删除了粗体部分,则SP工作正常如果未删除,则出现以

我有一个将两个表连接在一起的存储过程。我需要从原始SP中未包含的新表中添加一个新字段。我尝试的是为原始SP中父表的子记录中的每条记录从新表中添加一个字段。 我在一个测试查询中测试了基于父表的总和,结果很好:

select totaldollars from TTS_EmpTime where emptimedaytotal_id='32878'
因此,下一步将是集成到SP中。我这样做了,并将SP的新部分设置为粗体,以便您可以看到添加了什么。如果删除了粗体部分,则SP工作正常如果未删除,则出现以下错误:


*Msg 8120,16级,状态1,程序TTS_RptTest2,第11行

列“TTS_EmpTimeDayTotal.EmployeeID”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句*中。 这是我的存储过程:

    USE [TTSTimeClock]
GO
/****** Object:  StoredProcedure [dbo].[TTS_RptTest2]    Script Date: 03/04/2011 12:29:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[TTS_RptTest2]
    @BureauID nvarchar(36),
    @CompanyID nvarchar(36),
    @DivisionID nvarchar(10) ,      
    @punchDate smalldatetime,   
    @PeriodDays integer,    
    @EmployeeID nvarchar(20) = null

As
--with DayTotals as(
    select 
        DayTotal.DivisionID,
        DayTotal.EmployeeID,
        EmpData.EmployeeFirstName AS First, 
        EmpData.EmployeeLastName AS Last,
        EmpData.employeetypeid AS EmpId,        
        DayTotal.ID as DayTotalID,  
        -- Format the Date as MM/DD DOW or 2Digit Month & 2Digit Day and the 3Char Day of the week Uppercase  
        convert(varchar(5),DayTotal.PunchDate,101) + '  ' + upper(left(datename(dw,DayTotal.Punchdate),3))as PunchDate, 
        -- Format the in and out time as non military time with AM or PM No Dates
        substring(convert(varchar(20), DayTotal.FirstDayPunch, 9), 13, 5) + ' ' + substring(convert(varchar(30), DayTotal.FirstDayPunch, 9), 25, 2)as TimeIn,
        substring(convert(varchar(20), DayTotal.LastDayPunch, 9), 13, 5) + ' ' + substring(convert(varchar(30), DayTotal.LastDayPunch, 9), 25, 2) as TimeOut,
        DayTotal.RegularHours,
        DayTotal.NonOvertimeHours,
        DayTotal.OvertimeHours,
        DayTotal.TotalDayHRS,   
        DayTotal.PeriodRegular,
        DayTotal.PeriodOtherTime,
        DayTotal.PeriodOvertime,
        DayTotal.PeriodTotal,
        **sum(cast(EmpTime.TotalDollars as float)) as TotalDayDollars** 
    from TTS_EmpTimeDayTotal as DayTotal 
         INNER JOIN TTS_PayrollEmployees AS EmpData
         ON DayTotal.EmployeeID = EmpData.EmployeeID
         **inner JOIN TTS_Emptime as EmpTime 
         ON DayTotal.id = emptime.emptimedaytotal_id**
    where
        DayTotal.BureauID = @BureauID
        AND DayTotal.CompanyID = @CompanyID
        AND (DayTotal.DivisionID = @DivisionID)
        AND daytotal.periodstart = 
                 -- Period start date
                (SELECT DISTINCT PeriodStart
                 FROM TTS_EmpTimeDayTotal 
                 WHERE(BureauID = @BureauID) AND (CompanyID = @CompanyID) AND ( (DivisionID = @DivisionID)) 
                 AND (PunchDate = @punchDate)and periodend = dateadd(d,(@PeriodDays - 1),(periodstart))) 
        AND daytotal.periodend = 
                -- Period End Date 
                (SELECT DISTINCT PeriodEnd
                 FROM TTS_EmpTimeDayTotal 
                 WHERE(BureauID = @BureauID) AND (CompanyID = @CompanyID) AND ( (DivisionID = @DivisionID)) 
                 AND (PunchDate = @punchDate)and periodend = dateadd(d,(@PeriodDays-1),(periodstart))) 
    -- Optional all employees or just one       
    AND (( @EmployeeID is Null) or (DayTotal.EmployeeID = @EmployeeID)) 
    order by Empdata.employeetypeid,DayTotal.punchdate
我根本没有分组,所以这一定是由其他原因造成的?
任何帮助都将不胜感激

这是SQL Server吗?看起来是这样。您使用的是
SUM
,一个聚合函数,如果没有GROUPBY子句,我不相信您可以使用它。你是一直把总数放在那里,还是把它加到新的表格旁边

如果是后者,那很可能是你的问题

更新

根据OP的评论:


哇,那可能很痛苦,我会怎么做 比如groupby field1,field2, 等等就像在昏迷中一样 列表是否有其他方式包括 这是一个更好的领域

是的,在SQL Server中,使用聚合函数时必须明确分组。在您的情况下,另一种选择是将分组作为子查询,并在此基础上加入,即:


然后只需在选择列表中引用
EmpTime.totaldaydounds
,而不是在那里执行求和。

您需要按照
SELECT
列表中的
SUM
进行分组。是的,SQL Server 2005的求和部分是新添加的部分。如果我只拉一个字段,我会分组什么?你需要在选择中的每个其他字段上分组,这不是总和的一部分。哇,那可能会很痛苦。我会做一些像groupby field1、field2之类的事情吗?如在分隔的列表中。有没有其他更好的方法包含这个字段?我在GROUPBY子句中添加了所有字段,现在它跳过了任何空的记录,但我需要它们显示出来。有没有一种方法可以让我对没有总和的记录使用0?这会更干净,效果更好,谢谢。如果你能马上知道我如何能包括没有金额的记录,那就太好了。例如,这是一张时间卡的一周视图,它只是现在才提取其中包含时间的数据,我还希望有没有时间记录的日子,美元金额是空的
FROM TTS_EmpTimeDayTotal AS DayTotal 
INNER JOIN TTS_PayrollEmployees AS EmpData ON DayTotal.EmployeeID = EmpData.EmployeeID
INNER JOIN (SELECT EmpTimeDayTotal_id, SUM(CAST(TotalDollars AS FLOAT)) AS TotalDayDollars
            FROM TTS_Emptime
            GROUP BY EmpTimeDayTotal_id) AS EmpTime ON DayTotal.id = EmpTime.EmpTimeDayTotal_id