首页 > 解决方案 > 使用 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"

请帮忙!-皮特

标签: sqlpostgresqlsubquery

解决方案


我认为您正在寻找使用该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;

推荐阅读