我希望在任何给定时间获得每种产品每个设施的活跃租金计数。我还希望该设施为每种产品提供的最大活动租金。
一个例子:
在同一结果行中同时获得两个请求的结果将是很棒的,但这不是必需的。
我已经解决了第一部分,但是第二部分有问题。 到目前为止,我对第二个请求的要求是:
SELECT
COUNT(ISNULL(r.DeliveredProductId, r.OrderedProductId)) AS Amount,
ISNULL(r.DeliveredProductId, r.OrderedProductId) AS ProductID,
d.ProductName,
f.FacilityName
FROM
Rental r
INNER JOIN
Product d ON (ISNULL(r.DeliveredProductId, r.OrderedProductId) = d.ProductId)
INNER JOIN
Facility f ON r.FacilityId = f.FacilityId
LEFT OUTER JOIN
Task t ON (r.DeliveryTaskId = t.TaskId)
LEFT OUTER JOIN
vEvent e ON (t.TaskId = e.TaskId) AND (t.CloseEventId = e.EventId)
WHERE
(r.RentalStatusId = 2 OR r.RentalStatusId = 3)
AND (e.EventDate BETWEEN e.EventDate AND r.StopBillingDate)
GROUP BY
ISNULL(r.DeliveredProductId, r.OrderedProductId),
d.ProductName, f.FacilityName
RentalStatusId = 2
用于有效租金,3
用于封闭租金。 e.EventDate
是开始租用的日期,r.StopBillingDate
是结束租用的日期。
因此,我希望最大数量具有相同ProductID和相同FacilityID的产品的数量在某一时刻处于开始租赁日期和结束租赁日期的范围内。
我认为我必须在某个地方使用MAX函数才能获得最大的活动租金,但这只是令人困惑。
答案 0 :(得分:1)
我现在没有SQL Server和您的表可以在我的机器上进行测试。但我认为您正在寻找类似sql的代码:
Select TOP 1 T.ProductName, T.FacilityName, T.Amount from
(
--Your SubQuery to find the Sum of the Amount grouping by your Facility and Product
Select ProductName, FacilityName, Count(*) as Amount
From Your table, Joins
Where Your Filters
Group By Productname, FacilityName
) T
Order by T.Amount Desc
这只是给您一些想法,对于编写完整的解决方案给您带来的不便,我们深表歉意。 使用子查询查找将同时支持这两个上下文的摘要数据。并使用外部查询进行更多过滤,并使用您的子查询结果找到确切的解决方案。
答案 1 :(得分:0)
我通过以下查询解决了该问题:
WITH cte_Rental_Calendar
AS (
SELECT CAST('2015-01-01' AS DATE) AS dt
UNION ALL
SELECT CAST(DATEADD(dy, +1, dt) AS DATE) AS dt
FROM cte_Rental_Calendar
WHERE dt < getdate()
)
Select T.ProductName, T.FacilityName, Max(T.dt) as ByMonth, Max(T.rec_cnt) as MaxAmount from(
SELECT c.dt
, d.ProductName
, f.FacilityName
, Count(*) AS rec_cnt
FROM cte_Rental_Calendar c
INNER JOIN Rental r
ON 1 = 1
LEFT OUTER JOIN Task t
ON r.DeliveryTaskId = t.TaskId
LEFT OUTER JOIN vEvent e
ON t.TaskId = e.TaskId
AND t.CloseEventId = e.EventId
INNER JOIN Product d
ON isnull(r.DeliveredProductId, r.OrderedProductId) = d.ProductId
INNER JOIN Facility f
ON r.FacilityId = f.FacilityId
WHERE c.dt between e.EventDate and r.StopBillingDate and (r.RentalStatusId = 2 or r.RentalStatusId = 3 )
GROUP BY c.dt
, isnull(r.DeliveredProductId, r.OrderedProductId)
, d.ProductName
, f.FacilityName ) T
group by T.ProductName, T.FacilityName
OPTION (MAXRECURSION 10000)