如何使用 sql 中的单个查询获取项目计数和总计数?

Posted

技术标签:

【中文标题】如何使用 sql 中的单个查询获取项目计数和总计数?【英文标题】:How to get item count along with total count with a single query in sql? 【发布时间】:2021-04-04 04:46:47 【问题描述】:

我有一张表,其中存储有关一家糖果店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等。

我需要从表格中获取这些信息。

每个地点销售最多的商品以及在这些地点销售的商品总数。

下面是表格的结构

     Column     |            Type             | Modifiers 
----------------+-----------------------------+-----------
 id             | integer                     | 
 date           | timestamp without time zone | 
 item           | character varying(15)       | 
 location       | character varying(25)       | 

现在我把它分成两个独立的问题

    每个位置哪个商品的销量最高 每个位置销售的商品总数。

这些是我的疑问:

查询 #1:

select location, item, count(item) as count_ 
from sweet_shop 
group by location, item;

查询 #2:

select location, count(item) as count_ 
from sweet_shop 
group by location;

如您所见,我进行了两个单独的查询,然后我需要将这两个信息映射到正确的位置并获得最终输出。我正在寻找如下的输出

  location     |  item             | item_count    total_count 
---------------+-------------------+-------------|----------
 BA2           | candies           |   400       |     550
 BA4           | pastries          |   320       |     610 
 BA3           | waffles           |   250       |     400 
 BA7           | ice creams        |   180       |     500

但我想在单个查询中获取此信息,而不是进行两个单独的查询。如何做到这一点?

注意:我使用的是 Postgres 9.2

【问题讨论】:

【参考方案1】:

我将按位置和项目聚合,使用COUNT() 作为分析函数来生成每个位置的总数。此外,使用ROW_NUMBER 来确定每个位置中表现最好的项目。

WITH cte AS (
    SELECT location, item, COUNT(*) AS item_count,
           SUM(COUNT(*)) OVER (PARTITION BY location) AS total_count,
           ROW_NUMBER() OVER (PARTITION BY location
                              ORDER BY COUNT(*) DESC) rn
    FROM sweet_shop
    GROUP BY location, item
)

SELECT location, item, item_count, total_count
FROM cte
WHERE rn = 1;

【讨论】:

【参考方案2】:

Postgres 有一个很好的扩展 DISTINCT ON,它允许你在没有子查询的情况下做到这一点:

SELECT DISTINCT ON (location) location item,
       COUNT(*) AS item_count,
       SUM(COUNT(*)) OVER (PARTITION BY location) AS total_count
FROM sweet_shop
GROUP BY location, item
ORDER BY location, COUNT(*) DESC;

DISTINCT ON 返回具有相同键的一组行的第一行,其中“first”由ORDER BY 子句定义。

【讨论】:

以上是关于如何使用 sql 中的单个查询获取项目计数和总计数?的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助编写查询以获取总计数和唯一计数

Sql查询在同一查询中查找具有差异条件的计数和总计数

Django通过查询集中的唯一值获取总计数和计数

单个 SQL 查询中的多个计数

是否有任何其他选项可以从表中获取总计数和同一查询中列的不同计数?

复杂 SQL 计数查询