【问题标题】:Conditional aggregation query giving result for individual record为单个记录提供结果的条件聚合查询
【发布时间】:2021-03-15 18:47:55
【问题描述】:

我有如下表格

订购

OrderID UserID
1 7
2 1
3 13
4 7

出租物品

RentalItemsID ItemID ReturnTypeID OrderID
1 9 5 1
2 3 4 2
3 4 5 2
4 5 5 2
5 10 4 3
6 11 4 4
7 14 5 4

ReturnTypeID 5:缺陷返回

ReturnTypeID 4:正常返回

select [order].UserID,
    (
        select avg(case when ReturnTypeID = 5 then 1.0 else 0 end) as DefectedRate
        from RentalItems 
        where RentalItems.OrderID = [Order].OrderID 
    ) as DefectedReturnRate
from [Order] 
where OrderID in (select OrderID from RentalItems where ReturnTypeID=5)

当前输出:计算为:DefetedReturnByUserPerOrder/AllReturnsByUserPerOrder

UserID DefectReturnRate Showing Calculation, (Not incl. in output)
7 1.00 Order1: 1/1 - Contained 1 item and it was defected returned
1 0.66 Order2: 2/3 - Contained 3 items and 2 were defected returned
7 0.50 Order4: 1/2 - Contained 2 items and 1 was defected returned

如您所见,它计算的是每个订单的 DefetecedReturnRate,而不是用户在所有订单中租用的物品总数

所需的输出: TotalDefetedReturnByUserForALLOrders/AllReturnsByUserForAllOrders

UserID DefectReturnRate Showing Calculation, (Not incl. in output)
7 0.66 Order1&4: 2/3 - Total Rented items by User 7 were 3 and 2 were defected Returns
1 0.66 Order2: 2/3 - Contained 3 items and 2 were defected returned

我认为这将是我的最后一个问题,因此我们将不胜感激任何帮助。我可以提供 DML+DDL 数据,但我不确定如何提供。我试图生成脚本,但它只生成表而不是数据。但表格和数据与我在上面的表格中输入的完全一样。

【问题讨论】:

  • 您通过编写创建临时表语句(或表变量语句)和编写插入少量数据样本的语句来创建DDL+DML: ) 您可以在此站点上的许多问题和答案中看到它。 Example
  • 哦……我明白了。我认为这是可以生成的东西。谢谢!。
  • 您可以从SSMS生成它stackoverflow.com/questions/982568/…
  • 谢谢@Charlieface,我刚试了一下,效果很好!!

标签: sql sql-server tsql


【解决方案1】:

你可以这样做:

SELECT UserID, AVG(case when ReturnTypeID = 5 then 1.0 else 0 end) as DefectedRate
FROM orders 
JOIN dbo.RentalItems AS ri
   ON ri.OrderID = orders.OrderID
WHERE ri.OrderID in (select OrderID from RentalItems where ReturnTypeID = 5)
GROUP BY UserID

【讨论】:

  • 啊……我明白你做了什么。谢谢!!
【解决方案2】:

您也可以稍微不同地编写它,而无需两次点击 RentalItems。

这种方式产生 5 次逻辑读取而不是 12 次逻辑读取,因此在现实世界中性能会更高,如果这对您的情况很重要。

select distinct userid, Returned
from (
    select o.userid,  Sum (case when ReturnTypeId=5 then 1.0 end) over( partition by userid) / Count(*) over(partition by userid)  Returned
    from Orders o
    join RentalItems ri on ri.orderid=o.orderid
)s
where returned is not null

【讨论】:

  • 在我的情况下没关系,但我也看到了你的方法。我希望我可以选择两个答案作为回复,但谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2014-10-22
  • 2018-12-11
  • 1970-01-01
  • 2014-02-23
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多