【问题标题】:Postgres can't figure out complex queryPostgres 无法计算出复杂的查询
【发布时间】:2016-04-13 20:41:33
【问题描述】:

对于这个非常复杂的查询,我需要一些帮助。我正在使用postgresql。这是我需要的最终结果: - 按 company.id 分组 - 按 mailers.mail_date 分组 - 计算邮件 - 计算客户订单 - 计算付款 - 显示是否有客户订单 - 总付款.payment_amt - Sum clearinghouse_orders.remit

我不确定如何嵌入如下图所示的表格:

任何帮助将不胜感激。我是个新手。

这是我要完成的工作,除了我需要对公司进行分组,以便结果首先按公司分组,然后按 Mail_date 分组

【问题讨论】:

  • 样本数据和期望的结果确实有助于解释您想要做什么。
  • 感谢您添加所需的结果。现在请添加示例数据输入。那么请尝试做某事。

标签: sql postgresql


【解决方案1】:

从左边的 3 个表格开始,您可以像这样加入它们

select *
from companies 
inner join dbas ON companies.id = dbas.company_id
inner join mailers ON dbas.id = mailers.dba_id

要获得“结果首先按公司分组,然后是 Mail_date”,请在列出这些列的查询中添加一个 GROUP BY 子句,并将这些列也包括在 ELECT 子句中。

SELECT
  companies.id, companies.name, mailers.mail_date
from companies 
inner join dbas ON companies.id = dbas.company_id
inner join mailers ON dbas.id = mailers.dba_id
GROUP BY
  companies.id, companies.name, mailers.mail_date

现在,当涉及到付款(例如)时,事情可能会变得很棘手,因为您希望准确地汇总这些金额。如果不是所有公司都有订单,您现在需要使用 LEFT JOIN,并且为了计算付款总和,我建议您在加入其他表之前先计算这些总和,如下所示:

SELECT
  companies.id, companies.name, mailers.mail_date, SUM(p.payment_amt)
from companies 
inner join dbas ON companies.id = dbas.company_id
inner join mailers ON dbas.id = mailers.dba_id

left join customer_orders ON dbas.id = customer_orders.dba_id
left join (
           select customer_order_id, SUM(payment_amt) as payment_amt
           from payments
           group by customer_order_id
          ) p on customer_orders.id = p.customer_order_id
GROUP BY
  companies.id, companies.name, mailers.mail_date

您在最终查询中包含的逻辑比此处包含的要多得多,但希望它能帮助您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多