【问题标题】:How to count specific column in psql?如何计算 psql 中的特定列?
【发布时间】:2021-08-30 00:31:56
【问题描述】:

首先,我很抱歉这个基本问题。我想将子数据和交易数量汇总为以下字段:

  • 金额(总计)
  • 级别(总级别)
  • 交易次数(交易次数)

我有 2 个相关的表。一个用户有很多交易。

  1. 用户表
    • 身份证
    • 姓名
  2. 事务表
    • 身份证
    • user_id
    • 金额
    • 级别

这是我测试过的查询。但是,它似乎没有按预期工作:

const query = `
      SELECT
        u.*,
        't.amount',
        't.level'
        COUNT('t.amountDiffCents') as "numberOfTransaction",
        SUM('t.level') as "Total Level",
        COUNT(u.*) OVER () as "totalCount"
      FROM "LoyaltyUser" as u
      INNER JOIN "Transaction" as t ON u.id = 't.userId'
      GROUP BY u.id
      LIMIT $limit
      OFFSET $offset;
    `;

先谢谢了。

【问题讨论】:

  • numberOfTransactiontotalCount 相比有何意义?如果它们的含义不同,请重命名它们,以便它们的含义显而易见。
  • 对不起。我误会了这一点。我已经改正了。请再次检查
  • @Dai Yea 当然。我想计算交易次数。
  • 但是“计算交易次数”是什么意思?我在您的架构中看不到时间戳...在这种情况下,您应该避免使用诸如“时间”之类的模棱两可的术语来指代“发生”或“行”。
  • 顺便说一句,你不应该在没有ORDER BY 的情况下使用LIMIT/OFFSET - 否则你的结果将是未定义的顺序。 PostgreSQL应该为此给你一个警告——我希望你没有使用 MySQL?

标签: postgresql


【解决方案1】:

单独聚合 Transactions 表,然后仅在之后加入用户:

SELECT
    u.*,
    agg.txn_count,
    agg.sum_level
FROM
    (
        SELECT
            t.user_id,
            COUNT(*) AS txn_count,
            SUM( t.level ) AS sum_level
        FROM
            transaction AS t
        GROUP BY
            t.user_id
    ) AS agg

    INNER JOIN loyalty_user AS u ON
        u.uid = agg.user_id

严格来说(ISO SQL)不可能在这个单一的结果集中有意义地包含所有transaction 行的总数(至少,在每一行中都没有重复值,ew)。相反,这可以由应用程序代码轻松执行 - 或在同一批次中使用第二个查询。

【讨论】:

  • 请问,agg 指的是什么?
  • @ChantySok agg 是来自内部 SELECT t.user_id, ... 查询的派生表的名称。
  • 感谢@Dai。你拯救了我的一天。但是,请问您我使用此查询来获取用户列表。如果用户和事务表之间不匹配。它不会显示数据。我可以设置是否没有子数据返回所有用户并设置count=0,sum_level=0
猜你喜欢
  • 2018-09-11
  • 2021-07-16
  • 2023-03-23
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
相关资源
最近更新 更多