【问题标题】:How to iterate through data from select statement using while loop and put them into temp table如何使用while循环遍历select语句中的数据并将它们放入临时表中
【发布时间】:2017-10-31 22:20:40
【问题描述】:

我在 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`

但是因为数据库是规范化的,所以它返回多行。例如,一名工人在某个日期为一位客户工作,他完成了基本时间和加班时间。现在基本和加班是费率类型,客户和费率类型之间存在一对多的关系,因此我为这个工人得到两行,我想要的是它应该为工人的此类工作历史显示一行,并在一行中显示基本作为一栏,加班作为另一栏。

我尝试使用数据透视,但因为我想显示小时数、工资率和收费率列,它无法正常工作。我不知道如何在存储过程中使用 while 循环并遍历此 select 语句的结果?我不想使用光标,所以如果你们能帮助我,这里会非常棒

【问题讨论】:

  • 你会喜欢的东西,aliases

标签: sql-server stored-procedures duplicates


【解决方案1】:

我会猜测你想要/需要什么。我认识到的一个特定问题是您的“基本/加班”以两行而不是两列出现。这很容易解决,我假设它们位于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'

顺便说一句,你说的是循环和游标,虽然我不知道你对它们有什么需求。

【讨论】:

    【解决方案2】:

    您想使用while 循环,而不是游标?你想做这一套;我会jointblRateTypes 表两次:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 2015-10-03
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      相关资源
      最近更新 更多