В настоящее время у меня есть шесть запросов, в которых я беру результаты и использую таблицу для вычисления двух разных конечных процентов. Я считаю, что это можно сделать в одном запросе и без электронной таблицы, но я недостаточно разбираюсь в SQL, чтобы понять это. Я надеюсь на какое-то направление от удивительных богов SQL здесь, на SO.TSQL вычисление из комбинированных запросов
У нас есть несколько мест, и вычислить Past Due% и просрочено Fallout%, за место, основанный на среднем двух других процентов:
- просроченными, Долларов ÷ Прогнозируемые Долларов = Просроченные, Поплавок%
- просроченными, Units ÷ Всего активных единиц = просрочено Unit%
- (просрочено Unit% + просрочено доллар%)/2 = просрочено%
Fallout использует одни и те же вычисления, но смотрит на то, что суммы будут завтра.
РЕШИТЬ: я потратил время на изучение подзапросов, и присоединился к ним в 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, EXCEPT для ProjectedDollars, которое запрашивает одну таблицу. – thelincster
для того, чтобы связывать таблицы, должны быть какие-то отношения, если у вас нет отношений, как вы ожидаете, что сервер sql даст вам этот запрос ... он не может, потому что вы не можете сказать это, что хотите. Вам нужно установить, как эта таблица связана с другими таблицами. – JonH