savanparmar Ответов: 1

Как перебирать данные из инструкции select с помощью цикла while и помещать их во временную таблицу


Привет,

я не такой уж профессионал в SQL, я застрял в одной точке и не могу найти выход из этой ситуации. я пытаюсь получить данные для одного отчета. я создал запрос для своей хранимой процедуры, который выглядит следующим образом .

SELECT dbo.tblWorkHistory.WeekEndingDate,dbo.tblWorkHistory.WorkerID, 
        dbo.tblTitles.Title + ' ' + dbo.tblWorkers.Forename + ' '  + dbo.tblWorkers.Surname AS WorkerName,
        dbo.tblClients.ClientName,dbo.tblWorkHistory.WorkDate,
        dbo.tblJobCategories.JobCategory,dbo.tblRateTypes.RateType,
        dbo.tblWorkHistoryRates.Hours,dbo.tblWorkHistoryRates.ChargeRate,
        dbo.tblClients.ClientID,dbo.tblBookings.CostCentreID,dbo.tblSites.SiteID,dbo.tblSiteRateContracts.JobCategoryID,
        dbo.tblWorkHistory.BranchID,dbo.tblSystemBranches.BranchLocation,dbo.tblWorkHistoryRates.RateTypeID,dbo.tblCostCentres.CostCentre, 
        dbo.tblSystemBranches.OwnerID, tblWorkHistory.StartTime, tblWorkHistory.FinishTime, tblWorkHistory.BreakHours,
        tblWorkHistoryRates.Hours * tblWorkHistoryRates.ChargeRate AS Charge
FROM    dbo.tblWorkHistory LEFT OUTER JOIN
        dbo.tblBookings ON dbo.tblWorkHistory.BookingID = dbo.tblBookings.BookingID LEFT OUTER JOIN
        dbo.tblSiteRateContracts ON dbo.tblBookings.SiteRateContractID = dbo.tblSiteRateContracts.SiteRateContractID LEFT OUTER JOIN
        dbo.tblSites ON dbo.tblSiteRateContracts.SiteID = dbo.tblSites.SiteID LEFT OUTER JOIN
        dbo.tblClients ON dbo.tblSites.ClientID = dbo.tblClients.ClientID LEFT OUTER JOIN
        dbo.tblJobCategories ON dbo.tblSiteRateContracts.JobCategoryID = dbo.tblJobCategories.JobCategoryID LEFT OUTER JOIN
        dbo.tblCostCentres ON dbo.tblBookings.CostCentreID = dbo.tblCostCentres.CostCentreID LEFT OUTER JOIN
        dbo.tblWorkers ON dbo.tblWorkHistory.WorkerID = dbo.tblWorkers.WorkerID LEFT OUTER JOIN
        dbo.tblTitles ON dbo.tblWorkers.TitleID = dbo.tblTitles.TitleID LEFT OUTER JOIN
        dbo.tblSystemBranches ON dbo.tblWorkHistory.BranchID = dbo.tblSystemBranches.BranchID LEFT OUTER JOIN
        dbo.tblSystemOwner ON dbo.tblSystemBranches.OwnerID = dbo.tblSystemOwner.OwnerID LEFT OUTER JOIN
        dbo.tblWorkHistoryRates ON dbo.tblWorkHistory.WorkHistoryID = dbo.tblWorkHistoryRates.WorkHistoryID LEFT OUTER JOIN
        dbo.tblRateTypes ON dbo.tblWorkHistoryRates.RateTypeID = dbo.tblRateTypes.RateTypeID
WHERE   (dbo.tblWorkHistory.InvoiceID IS NULL) AND (dbo.tblSiteRateContracts.IsDailyRate = 1) 
        AND (dbo.tblWorkHistory.Completed = 1)
        AND (dbo.tblWorkHistoryRates.Hours IS NOT NULL)
        AND (dbo.tblClients.BranchID = 9)
        AND (dbo.tblSystemBranches.OwnerID = 3


но поскольку база данных нормализована, она возвращает несколько строк. например, работник работал на одного клиента в один день, и он выполнял основные и сверхурочные часы. теперь основное и овертайм тарифам и есть 1 для многих отношения между клиентом и значения ratetype, следовательно, я получаю две строки на этого работника, что я хочу, является то, что он должен отображать одну строку для работника такой работы истории и в один ряд его вывести в одной колонке и сверхурочное время как другой столбец.

у меня нет большого представления о том, как я могу использовать цикл while внутри хранимой процедуры и перебирать результат этого оператора select? я не хочу использовать курсор так что если вы ребята можете пожалуйста помочь мне здесь будет действительно здорово полный

Что я уже пробовал:

я попробовал использовать pivot, но из-за того, что я хочу отображать столбцы hours, pay rate и charge rate, он не работает должным образом.

1 Ответов

Рейтинг:
1