sql - 如何将 2 个相关子查询与联接和条件聚合一起使用
问题描述
我在下面有 2 个查询,我希望将输出组合起来。
select distinct [User].UserID, fname, lname, JobTitle
from [User]
join [Order] on [User].UserID = [Order].UserID
用户身份 | 名称 | 名字 | 职称 |
---|---|---|---|
1 | 约翰 | 史密斯 | 工程师 |
2 | 特里 | 能源部 | 工程师 |
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)
用户身份 | 缺陷退货率 |
---|---|
1 | 0.66 |
2 | 0.33 |
期望的输出
用户身份 | 名称 | 名字 | 职称 | 缺陷退货率 |
---|---|---|---|---|
1 | 约翰 | 史密斯 | 工程师 | 0.66 |
2 | 特里 | 能源部 | 工程师 | 0.33 |
我的三个表如下:
用户: userID、fname、lname、JobTitle
订单: OrderID、UserID
RentalItems:RentalItemsID、OrderID
解决方案
鉴于您似乎只是需要用户信息,加入它怎么样?
select U.UserID, U.fname, U.lname, U.JobTitle,
(
select avg(case when ReturnTypeID = 5 then 1.0 else 0 end) as DefectedRate
from RentalItems R
where R.OrderID = o.OrderID
) as DefectedReturnRate
from [Order] O
inner join [User] U on U.UserID = O.UserID
where O.OrderID in (select OrderID from RentalItems where ReturnTypeID = 5);
为清楚起见,请注意使用漂亮的短表别名。
顺便说一句,如果您发现自己需要将 2 个查询连接在一起,您的操作与表连接完全相同,例如
select *
from (
{sub-query 1)
)
inner join (
{sub-query 2)
) on {some condition}
为了进一步获取有订单的用户列表,exists
子句比连接更清晰,例如
select UserID, fname, lname, JobTitle
from [User] U
where exists (select 1 from [Order] O where U.UserID = O.UserID)
推荐阅读
- python - Google Cloud Platform - 最终例外:b'[Errno 28] No space left on device') 用于下载
- javascript - 如何在点击时淡出图像
- string - 在 sqlite-jdbc 驱动(3.23 或 3.30)中,字符串过长时更新失败,无一例外。但是在命令行和navicat下就可以了
- angular - Angular Material 嵌套 Stepper 的标签位置被覆盖
- java - cmd突然关闭时如何确保Java程序创建的临时文件被删除
- c++ - C++ shared_ptr,如何从方法内创建的共享指针返回对对象的引用?
- python - python继承类函数
- c# - 如何将标签中的信息导入 C# 和 HTMLAgilityPack?
- sql - 两列上的复合非空约束
- node.js - VSCode 不会关闭子进程 (processChild.js)