sql - 使用 1 个查询在一个列中显示 COUNT(Items) 和 COUNT(相同的项目,但在另一列中具有特定值)
问题描述
提前感谢您的帮助!
我在一个虚拟数据库中有三个表:库存、电影和租赁。
我需要知道哪些电影片名不在库存中。我能想到的回答这个问题的唯一方法是计算库存中的每件物品,然后将该数量与尚未退回的相同物品的数量进行比较。
这将返回三列:
SELECT film.title, COUNT(inventory.film_id), (SELECT COUNT(inventory.film_id)
FROM inventory
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
INNER JOIN film on film.film_id = inventory.film_id
WHERE rental.return_date IS NULL)
FROM inventory
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
INNER JOIN film on film.film_id = inventory.film_id
GROUP BY film.title
输出:
"Graceland Dynamite" "6" "183"
"Opus Ice" "11" "183"
"Braveheart Human" "5" "183"
"Wonderful Drop" "9" "183"
...
如您所见,它在最后一列中显示了未退回 DVD 的总数,而我想要该列的总数。
如果我运行它并像这样查找库存计数:
SELECT film.title, COUNT(inventory.film_id)
FROM inventory
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
INNER JOIN film on film.film_id = inventory.film_id
GROUP BY film.title
这样可行:
"Graceland Dynamite" "6"
"Opus Ice" "11"
"Braveheart Human" "5"
...
如果我运行相同的操作,但只计算返回日期为 NULL 的库存:
SELECT film.title, COUNT(inventory.film_id), rental.return_date
FROM inventory
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
INNER JOIN film on film.film_id = inventory.film_id
WHERE rental.return_date IS NULL
GROUP BY film.title, rental.return_date
这也有效:
"Theory Mermaid" "1"
"Dances None" "2"
"Bound Cheaper" "1"
...
请让我知道您是否可以帮助我了解如何在一列中返回库存计数以及未退回物品的计数,如果您能告诉我如何有一个显示两者之间差异的列,请告诉我加分.
此外,如果有办法只返回差异为零的行,那就太好了。
或者,如果我只是想这一切都错了,也请告诉我!我需要我能得到的所有帮助。
谢谢!!
更新:
我也试过这样:
SELECT film.title, COUNT(inventory.film_id), x.copies_out
FROM (SELECT COUNT(rental.inventory_id) as copies_out
FROM rental
WHERE rental.return_date IS NULL) as x, inventory
INNER JOIN film ON film.film_id = inventory.film_id
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
GROUP BY film.title, x.copies_out, rental.inventory_id
HAVING COUNT(inventory.film_id) <= x.copies_out
这将返回 3 列,一列包含电影名称,一列包含库存中列出的总拷贝数,另一列包含仍未归还的租赁总数(不是具有该库存 ID 的租赁数量)尚未归还。)
"Giant Troopers" "5" "183"
"Confessions Maguire" "2" "183"
"Vacation Boondock" "3" "183"
请帮忙!-皮特
解决方案
我认为您正在寻找使用该filter
子句的条件聚合:
SELECT film.title,
count(inventory.film_id),
count(distinct rental.inventory_id) filter (where rental.return_date is null)
FROM inventory
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
INNER JOIN film on film.film_id = inventory.film_id
GROUP BY film.title;
推荐阅读
- javascript - 如何使用 Web Speech API 以一种可以听到 textarea 行的单词的方式,每行都以延迟的方式?
- c# - 为什么我的 ASP.NET Web 表单呈现缓慢?
- javascript - 人脸对比API
- javascript - 如何使分页位于选项卡内的页面底部?
- python - Discord.py - 使用计时器静音消息
- amazon-web-services - 如何根据某些属性将放大模型数据写入多个表并轻松查询?
- flutter - NullPointerException flutter_local_notifications 在版本更新后不起作用
- python - Google Nearby Places API 调用 - 请求无效
- jira - 在 Jira Software 中看不到“路线图”功能
- sql-server - 如果不在维度键属性上,则度量值组不受维度限制