sql - 在 SQL 中组合类似的行并聚合一些值

标签 sql postgresql aggregate-functions

我有一些无意义数据的示例表,如下所示:

+--------+---------+---------+--------+---------+
| Vendor |   Day   |  Item   | Amount | Revenue |
+--------+---------+---------+--------+---------+
| Bob    | Monday  | Apple   |      1 |    1.00 |
| Bob    | Monday  | Orange  |      1 |    1.00 |
| Bob    | Monday  | Peach   |      2 |    2.00 |
| Bob    | Monday  | Lettuce |      3 |    3.00 |
| Bob    | Monday  | Spinach |      5 |    5.00 |
| Bob    | Monday  | Cabbage |      3 |    3.00 |
| Bob    | Tuesday | Apple   |      2 |    2.00 |
| Bob    | Tuesday | Orange  |      2 |    2.00 |
| Bob    | Tuesday | Peach   |      0 |    0.00 |
| Bob    | Tuesday | Lettuce |      3 |    3.00 |
| Bob    | Tuesday | Spinach |      5 |    5.00 |
| Bob    | Tuesday | Cabbage |      5 |    5.00 |
| Cindy  | Monday  | Apple   |      1 |    1.00 |
| Cindy  | Monday  | Orange  |      3 |    3.00 |
| Cindy  | Monday  | Peach   |      3 |    3.00 |
| Cindy  | Monday  | Lettuce |      6 |    6.00 |
| Cindy  | Monday  | Spinach |      8 |    8.00 |
| Cindy  | Monday  | Cabbage |      2 |    2.00 |
| Cindy  | Tuesday | Apple   |      1 |    1.00 |
| Cindy  | Tuesday | Orange  |      3 |    3.00 |
| Cindy  | Tuesday | Peach   |      0 |    0.00 |
| Cindy  | Tuesday | Lettuce |      2 |    2.00 |
| Cindy  | Tuesday | Spinach |      3 |    3.00 |
| Cindy  | Tuesday | Cabbage |      4 |    4.00 |
+--------+---------+---------+--------+---------+

我想将 Item 中的值合并到类似的类别中,并将信息压缩到更少的行中,因为不需要这么多细节。例如,我想把 Apple、Orange 和 Peach 变成“Fruit”,然后把 Lettuce、Spinach 和 Cabbage 变成“Vegetable”,所有这些都不会丢失存储在 中的值金额收入

我要实现的表格应该如下所示:

+--------+---------+-----------+--------+---------+
| Vendor |   Day   |   Item    | Amount | Revenue |
+--------+---------+-----------+--------+---------+
| Bob    | Monday  | Fruit     |      4 |    4.00 |
| Bob    | Monday  | Vegetable |     11 |   11.00 |
| Bob    | Tuesday | Fruit     |      4 |    4.00 |
| Bob    | Tuesday | Vegetable |     13 |   13.00 |
| Cindy  | Monday  | Fruit     |      7 |    7.00 |
| Cindy  | Monday  | Vegetable |     16 |   16.00 |
| Cindy  | Tuesday | Fruit     |      4 |    4.00 |
| Cindy  | Tuesday | Vegetable |      9 |    9.00 |
+--------+---------+-----------+--------+---------+

这是我当前的 SQL 查询:

SELECT vendor, 
       day, 
       item_category, 
       Sum(amount), 
       Sum(revenue) 
FROM   (SELECT mytable.*, 
               CASE item 
                 WHEN 'Apple' THEN 'Fruit' 
                 WHEN 'Orange' THEN 'Fruit' 
                 WHEN 'Peach' THEN 'Fruit' 
                 WHEN 'Lettuce' THEN 'Vegetable' 
                 WHEN 'Spinach' THEN 'Vegetable' 
                 WHEN 'Cabbage' THEN 'Vegetable' 
               END AS item_category 
        FROM   mytable) AS x 
GROUP  BY vendor, 
          day, 
          item, 
          item_category;

此查询仍返回完整的行列表,而不是聚合类似的行。我将如何修改它以实现我想做的事情?

最佳答案

您需要通过语句从组中删除项目。以下是更多详细信息。

由于您正在抓取项目(苹果、橙子等),在您从顶部选择和分组依据中删除该项目之前,它仍然不会显示它们仅按 item_category 分组。

Group by 按语句的每个唯一组合进行分组,因此必须删除项目。

见下文。注意:我将 item_category 重命名为 item,这样看起来就像您所说的那样输出

SELECT vendor, 
   day, 
   item_category as item, 
   Sum(amount), 
   Sum(revenue) 
FROM   (SELECT mytable.*, 
           CASE item 
             WHEN 'Apple' THEN 'Fruit' 
             WHEN 'Orange' THEN 'Fruit' 
             WHEN 'Peach' THEN 'Fruit' 
             WHEN 'Lettuce' THEN 'Vegetable' 
             WHEN 'Spinach' THEN 'Vegetable' 
             WHEN 'Cabbage' THEN 'Vegetable' 
           END AS item_category 
    FROM   mytable) AS x 
GROUP  BY vendor, 
      day, 
      item_category;

关于sql - 在 SQL 中组合类似的行并聚合一些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734090/

相关文章:

sql - 删除基于多列的重复记录

sql - PostgreSQL 查询 - 临时表外的 AVG() 函数

sql - 将逗号分隔的列数据拆分为多列(可变大小)

MySQL Min()、MAX() 使用另一个表中的 ID

Mysql - 获取两个连续值之间的差异

java - 替换 SQL 字符串中的时间戳占位符

sql - postgresql - 使用聚合和最大值

mysql - 为什么聚合函数至少返回 1 行

MySQL:外键始终为0

Postgresql - SQL 查询列出数据库中的所有序列