如何在Postgresql中将两个选择查询水平组合在同一张表上?

维托维基

大家。我是Postgresql的初学者。最近我遇到一个问题。我有一张叫“ sales”的桌子。

create table sales
    (
        cust    varchar(20),
        prod    varchar(20),
        day integer,
        month   integer,
        year    integer,
        state   char(2),
        quant   integer
    );
insert into sales values ('Bloom', 'Pepsi', 2, 12, 2001, 'NY', 4232);
insert into sales values ('Knuth', 'Bread', 23, 5, 2005, 'PA', 4167);
insert into sales values ('Emily', 'Pepsi', 22, 1, 2006, 'CT', 4404);
insert into sales values ('Emily', 'Fruits', 11, 1, 2000, 'NJ', 4369);
insert into sales values ('Helen', 'Milk', 7, 11, 2006, 'CT', 210);
insert into sales values ('Emily', 'Soap', 2, 4, 2002, 'CT', 2549);
insert into sales values ('Bloom', 'Eggs', 30, 11, 2000, 'NJ', 559);

....总共有498行。这是此表的概述:

在此处输入图片说明

现在,我要计算每种产品的最大和最小销售数量,以及其相应的客户(购买产品),日期(即那些最大和最小销售数量的日期)以及销售交易发生的状态。以及相应产品的平均销售数量。

合并后的应该像这样:

在此处输入图片说明

它应该有10行,因为总共有10种不同的产品。

我试过了:

select prod,
       max(quant),
       cust as MAX_CUST
from sales
group by prod;

但它返回了一个错误,并表示应将客户归为“ by by”。但是我只想按产品类型分类。

此外,如何将max_q及其客户,日期,状态min_q及其客户,日期,状态以及AVG_Q产品名称水平组合我真的很困惑!

专线小巴

您可以使用分析函数ROW_NUMBER通过增加/减少子查询中每种产品的销售额来对记录进行排名,然后进行条件汇总:

SELECT
    prod product,
    MAX(CASE WHEN rn2 = 1 THEN quant END) max_quant,
    MAX(CASE WHEN rn2 = 1 THEN cust END) max_cust,
    MAX(CASE WHEN rn2 = 1 THEN TO_DATE(year || '-' || month || '-' || day, 'YYYY-MM-DD') END) max_date,
    MAX(CASE WHEN rn2 = 1 THEN state END) max_state,
    MAX(CASE WHEN rn1 = 1 THEN quant END) min_quant,
    MAX(CASE WHEN rn1 = 1 THEN cust END) min_cust,
    MAX(CASE WHEN rn1 = 1 THEN TO_DATE(year || '-' || month || '-' || day, 'YYYY-MM-DD') END) min_date,
    MAX(CASE WHEN rn1 = 1 THEN state END) min_state,
    avg_quant
FROM (
    SELECT
        s.*,
        ROW_NUMBER() OVER(PARTITION BY prod ORDER BY quant) rn1,
        ROW_NUMBER() OVER(PARTITION BY prod ORDER BY quant DESC) rn2,
        AVG(quant) OVER(PARTITION BY prod) avg_quant
    FROM sales s
) x
WHERE rn1 = 1 OR rn2 = 1
GROUP BY prod, avg_quant

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从同一张表中查询同一列但条件不同的两个不同的总和?

SQLAlchemy如何为同一张表定义两个模型

为什么我在同一张表中的两个日期之间选择不起作用?

MYSQL:同一张表上的两个联接成为双重分组计数。如何解决?

如何在同一张表中的同一模板上显示来自两个不同Django模型的实例?

当两个外键指向同一张表时如何使用Factory boy

如何使用Fluent在Vapor 3的同一张表中进行两个JOIN查询?

如何在fullPage.js中将一张图片放在两个屏幕上

PostgreSQL-它会在同一张表上使用两个索引吗?

mysql在同一张表上组合不同的count()

如何在MySQL的同一张表上使用join合并这两个查询?

在同一张表上用两个不同的条件缩短左联接

同一张表上的两个外键以显示父字段

同一张表上的两个select语句并获得Count(*)

同一张表中的两个JOINS

如何在sql查询的一部分中将两个foreach循环正确地组合在一起?

同一张表上的两个外键:如何在删除级联上实现?

MySQL:如何在单个查询的同一张表中进行选择和删除?

如何在MySQL中将两个不同的表组合在一起并对其进行排序

从同一张表中提取两个查询

如何从orientDB的同一张表中检索两个不同边的数据?

如何合并同一张表中的两个hasMany关系?

MYSQL:通过同一张表中的两个外键选择

同一张表上的两个主键和外键

我如何在同一张表上找到同时存在于两个条件的记录,并将它们显示在同一行的不同列名下

如何使用 tensorboardX 在同一张图表上获得两个标量?

MySQL 从一张表中选择唯一记录,并使用 NOT IN 进行两个选择查询

前 5 条记录,合并来自同一张表的两个查询

MySQL联合同一张表的两个查询