我目前有六個查詢,其中我拿出結果並使用電子表格來計算兩個不同的最終百分比。我相信它可以在單個查詢中完成,並且不需要電子表格,但是我在SQL方面的知識還不夠豐富。我希望從這裏的神奇SQL神們獲得一些指導。通過組合查詢計算TSQL
我們有幾個位置,並計算逾期%和過期輻射%,每個位置的基礎上,平均另外兩個百分比:
- 過期元÷預計美元= 過期浮法%
- 逾期單位數÷總活性單位= 逾期單位%
- (逾期單元% + 過去由於美元%)/ 2 = 逾期%
輻射使用相同的計算,但看什麼的金額將是明天。
已解決:我花時間學習了子查詢,並加入了STID。感謝所有幫助和指導我正確指導 的人。
這是我的最終代碼:
SET DATEFIRST 1;
DECLARE @Today date = dbo.getdateparam(92,999);
DECLARE @TodayNum int = DATEPART(dw, @Today);
DECLARE @Saturday date = DATEADD(DAY, ([email protected])%7, @Today);
DECLARE @PrevSat date = DATEADD(DAY, -7, @Saturday);
Select store.STID As Store,
Proj.ProjRent As Projected,
PDRent.PastDueDollars As PDRent,
UOR.Units As UOR,
PDUnits.UnitsPD As PDUnits,
(PDRent.PastDueDollars/Proj.ProjRent) * 100 As FloatPerc,
(Cast(PDUnits.UnitsPD As Decimal)/Cast(UOR.Units As Decimal)) *
100 As UnitPerc,
Cast(Round((((PDRent.PastDueDollars/Proj.ProjRent) * 100) +
((Cast(PDUnits.UnitsPD As Decimal(18,4))/Cast(UOR.Units As Decimal(18,4))) *
100))/2, 2) As Decimal(18,2)) As PDPerc,
Reds.RedsPD As PDReds,
Round(Cast(Reds.RedsPD As Float)/Cast(UOR.Units As Float) * 100,
2) As RedsPerc
From
-- Stores
(Select Distinct Stores.STID,
Stores.StoreName,
Stores.EMail,
Stores.ManagersName
From Stores
Where Stores.STID Not In (7, 999)) As store
-- Projected Rent
Left Join (Select CashProj.STID,
Sum(CashProj.ProjectedRental) As ProjRent
From CashProj
Where CashProj.ProjectionDate Between DateAdd(mm, DateDiff(mm, 0, @Today),
0) And DateAdd(mm, DateDiff(mm, 0, @Today) + 1, 0)
Group By CashProj.STID) As Proj On store.STID = Proj.STID
-- Past Due Float
Left Join (Select Agreemnt.STID As STID,
Sum(DateDiff(d, Agreemnt.DueDate, (Case DatePart(dw, @Today)
When '1' Then DateAdd(DAY, -7, DateAdd(DAY, (6 - DatePart(dw,
@Today)) % 7, @Today)) When '6' Then @Today
Else DateAdd(DAY, (6 - DatePart(dw, @Today)) % 7, @Today)
End)) * Round(Agreemnt.WeeklyRate/7, 2)) As PastDueDollars,
DatePart(dw, @Today) As TodayNum,
DateAdd(DAY, -7, DateAdd(DAY, (6 - DatePart(dw, @Today)) % 7,
@Today)) As PrevSat,
DateAdd(DAY, (6 - DatePart(dw, @Today)) % 7, @Today) As Saturday
From Agreemnt
Where Agreemnt.AStatID = 1 And Agreemnt.DueDate < (Case DatePart(dw,
@Today)
When '1' Then DateAdd(DAY, -7, DateAdd(DAY, (6 - DatePart(dw,
@Today)) % 7, @Today)) When '6' Then @Today
Else DateAdd(DAY, (6 - DatePart(dw, @Today)) % 7, @Today)
End) And Agreemnt.RentToRent = 0
Group By Agreemnt.STID) As PDRent On store.STID = PDRent.STID
-- Units On Rent
Left Join (Select Invntry.STID,
Cast(Count(Invntry.StockNumber) As Int) As Units
From Invntry
Inner Join AgreHist On Invntry.InvID = AgreHist.InvID And
Invntry.STID = AgreHist.STID
Inner Join Agreemnt On Agreemnt.STID = AgreHist.STID And
Agreemnt.AgreeID = AgreHist.AgreeID And Agreemnt.AStatID =
AgreHist.AStatID
Where Invntry.InvStatID = 11 And Invntry.DisposalDate Is Null And
Agreemnt.AStatID = 1
Group By Invntry.STID) As UOR On store.STID = UOR.STID
-- Past Due Units
Left Join (Select Invntry.STID,
Cast(Count(Invntry.StockNumber) As Int) As UnitsPD
From Invntry
Inner Join AgreHist On Invntry.InvID = AgreHist.InvID And
Invntry.STID = AgreHist.STID
Inner Join Agreemnt On Agreemnt.STID = AgreHist.STID And
Agreemnt.AgreeID = AgreHist.AgreeID And AgreHist.AStatID =
Agreemnt.AStatID
Where Invntry.InvStatID = 11 And Invntry.DisposalDate Is Null And
Agreemnt.AStatID = 1 And Agreemnt.DueDate < (Case @TodayNum When '1' Then @PrevSat When '6' Then @Today Else @Saturday End) And Agreemnt.RentToRent = 0
Group By Invntry.STID) As PDUnits On store.STID = PDUnits.STID
-- Reds
Left Join (Select Invntry.STID,
Count(Invntry.StockNumber) As RedsPD
From Invntry
Inner Join AgreHist On Invntry.InvID = AgreHist.InvID And
Invntry.STID = AgreHist.STID
Inner Join Agreemnt On Agreemnt.STID = AgreHist.STID And
Agreemnt.AgreeID = AgreHist.AgreeID And Agreemnt.AStatID =
AgreHist.AStatID
Where Invntry.InvStatID = 11 And Invntry.DisposalDate Is Null And
Agreemnt.AStatID = 1 And Agreemnt.DueDate < DateAdd(day, -15, Case
Cast(DatePart(dw, @Today) As Int)
When '1' Then Cast(DateAdd(DAY, -7, DateAdd(DAY, (6 - DatePart(dw,
@Today)) % 7, @Today)) As Date)
When '6' Then Cast(@Today As Date)
Else Cast(DateAdd(DAY, (6 - DatePart(dw, @Today)) % 7, @Today) As
Date) End) And Agreemnt.RentToRent = 0
Group By Invntry.STID) As Reds On store.STID = Reds.STID
Order By Store
沒有閱讀所有這些細節..我有一個簡單的問題給你。在所有這些查詢中,是否有任何字段(表中的列)將所有這些查詢關聯在一起?如果是這樣,你的答案很簡單,你可以使用派生查詢加入所有這些查詢。它看起來像你的結果集說是的有..所以你會做'SELECT .. FROM FirstQuery t1 JOIN(SELECT .. FROM YourSecondQuery)t2 ON t2.SomeID = t1.SomeID',你從那裏繼續。 – JonH
@JonH所有的共同字段Agreemnt.STID,ProjectedDollars除外,其中查詢單個表。 – thelincster
爲了關聯表需要有一些關係,如果你沒有這種關係,你如何期待sql server給你這個查詢......它不能因爲你不能告訴它你想要什麼。你需要確定這張表如何鏈接到其他表。 – JonH