我不是SQL中的专业版,我被困在一个点上,无法找到一条出路。我正在尝试获取一份报告的数据。我为我的存储过程创建了一个查询,就像这样。如何使用while循环遍历select语句中的数据并将它们放入临时表中
`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`
但由于数据库已规范化,它会返回多行。例如一名工人在一个日期为一个客户工作,他已经完成了基本工作时间和加班时间。现在基本和加班费率类型和客户端和ratetype之间有1对多的关系,因此我得到这个工人的两行,我想要的是,它应该显示一行工人的这种工作历史,并在一行中显示基本作为一列和加班作为另一列。
我尝试使用数据透视表,但因为我想显示小时,付费率和收费率列它工作不正常。我没有太多的想法,我可以如何使用while循环内存储过程,并迭代通过这个选择语句的结果?我不想使用光标,所以如果你们可以请帮我在这里将会非常棒!
你会喜欢的东西,[别名](https://technet.microsoft.com/en-us/library/ms187455(v = sql.105).aspx)。 – KtX2SkD