如何使用while循环遍历select语句中的数据并将它们放入临时表中

时间:2017-05-31 08:13:37

标签: sql-server stored-procedures duplicates

我不是那个专业的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`

但由于数据库已规范化,因此会返回多行。例如,一个工人在一个日期为一个客户工作,他已经完成了基本和加班时间。现在基本和加班都是费率类型,客户端和ratetype之间有1对多的关系,因此我得到这个工人的两行,我想要的是它应该为工人的这样的工作历史显示一行,并在一行显示基本作为一列和加班作为另一列。

我尝试使用枢轴,但因为我想显示小时数,支付率和费率列,它不能正常工作。我不知道如何在存储过程中使用while循环并迭代这个select语句的结果?我不想使用光标,所以如果你们可以请帮助我,这里真的很棒

2 个答案:

答案 0 :(得分:0)

您想使用while循环,但不是游标?你想做这套基础;我会join tblRateTypes表两次:

SELECT         {Your attributes}
,              Basic.Rate AS Basic_Rate
,              Overtime.Rate AS Overtime_Rate
FROM           {Your Tables}
LEFT JOIN      dbo.tblRateTypes Basic
            ON dbo.tblWorkHistoryRates.RateTypeID = Basic.RateTypeID
            AND Basic.RateTypeID = 1 -- Or whatever the code is for Basic
LEFT JOIN      dbo.tblRateTypes Overtime
            ON dbo.tblWorkHistoryRates.RateTypeID = Overtime.RateTypeID
            AND Overtime.RateTypeID = 2 -- Or whatever the code is for Overtime

请注意这里使用别名,它们使您的代码更容易理解。

答案 1 :(得分:0)

我会猜测你想要/需要什么。我认识到的一个问题是你的“基本/加班”是两行而不是两列。这很容易解决,我假设它们属于专栏RateType

-- Replace this line in your query.
LEFT OUTER JOIN dbo.tblRateTypes ON dbo.tblWorkHistoryRates.RateTypeID = dbo.tblRateTypes.RateTypeID
-- With these two lines below.
LEFT OUTER JOIN dbo.tblRateTypes ON dbo.tblWorkHistoryRates.RateTypeID = dbo.tblRateTypes.RateTypeID AND dbo.tblRateTypes.RateType = 'Basic'
LEFT OUTER JOIN dbo.tblRateTypes ON dbo.tblWorkHistoryRates.RateTypeID = dbo.tblRateTypes.RateTypeID AND dbo.tblRateTypes.RateType = 'Overtime'

顺便说一句,你在谈论循环&游标,虽然我无法想象你需要什么,但是。