2017-05-31 24 views
0

我不是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循環內存儲過程,並迭代通過這個選擇語句的結果?我不想使用光標,所以如果你們可以請幫我在這裏將會非常棒!

+1

你會喜歡的東西,[別名](https://technet.microsoft.com/en-us/library/ms187455(v = sql.105).aspx)。 – KtX2SkD

回答

0

你想使用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 

請注意這裏使用別名,它們使你的代碼更容易被理解。

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' 

通過你在談論循環&光標的方式,但我想不出有什麼需要你有他們,但。

相關問題