Нужна помощь в присоединении 3-го стола к Stored Proc - PullRequest
0 голосов
/ 04 марта 2011

У меня есть хранимая процедура, которая отлично работает, объединяя 2 таблицы. Мне нужно было добавить новое поле из новой таблицы, которая не была включена в исходный SP. То, что я пытаюсь сделать, это суммировать поле из новой таблицы для каждой записи, которая является дочерней записью родительской таблицы, которая находится в исходном SP. Я проверил сумму на основе родительской таблицы в тестовом запросе, и она отлично работает:

select totaldollars from TTS_EmpTime where emptimedaytotal_id='32878'

так что следующим шагом будет интеграция в SP. Я сделал это и установил жирным шрифтом новые части SP, чтобы вы могли видеть, что было добавлено. Если полужирные части удалены, SP работает нормально, если нет, я получаю эту ошибку:


* Сообщение 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

Я вообще не группируюсь, так что это должно быть вызвано чем-то другим? Любая помощь будет оценена

1 Ответ

2 голосов
/ 04 марта 2011

Это SQL Server? Похоже на то. Вы используете SUM, агрегатную функцию, и я не думаю, что вы можете использовать без предложения GROUP BY. У вас всегда была СУММА или вы добавили ее вместе с новым столом?

Если последнее, то это может быть вашей проблемой.

Обновление

На основании комментария ОП:

Ого, это может быть больно что-то вроде groupby field1, field2, и так далее? как в коме список. Есть ли другой способ включить это одно поле, которое было бы лучше?

Да, в SQL Server вы должны явно указывать группировки при использовании агрегатной функции. В вашем случае альтернативой может быть группировка в качестве подзапроса и присоединение к , что , т.е.

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

А затем просто сослаться на EmpTime.TotalDayDollars в списке SELECT вместо того, чтобы выполнять СУММУ там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...