SQL Server如何查询每个产品每个设施的最大活动租金?

时间:2018-08-13 19:42:17

标签: sql sql-server

我希望在任何给定时间获得每种产品每个设施的活跃租金计数。我还希望该设施为每种产品提供的最大活动租金。

一个例子:

  1. 今天,设施A有6个产品Z的有效租金。
  2. A设施对产品Z进行的活动租金最多为22。

在同一结果行中同时获得两个请求的结果将是很棒的,但这不是必需的。

我已经解决了第一部分,但是第二部分有问题。 到目前为止,我对第二个请求的要求是:

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函数才能获得最大的活动租金,但这只是令人困惑。

2 个答案:

答案 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)