【问题标题】:How to sum multiple transactions per account id and then subquery the category of transactions between a certain dollar value?如何对每个帐户 id 的多个交易求和,然后子查询某个美元价值之间的交易类别?
【发布时间】:2022-01-19 02:52:41
【问题描述】:

我正在尝试创建一个查询,它为我提供了按账户交易的总美元价值对账户进行分组的结果。该表列出了每笔交易,列有account_id(每次有人交易时都会列出)和unit_count(他们交易的美元价值)。

问题是我不知道如何在分组之前获得每个 account_id 的总美元价值 (unit_count) 的结果。我创建的当前查询结果是对单个交易进行分类,而不是对每个帐户的总价值进行分类:

WITH transaction_collapsed (unit_count, transaction_group) AS
(SELECT account_id,
    CASE WHEN unit_count <= 10 then 'less than or equal to 10'
         WHEN unit_count BETWEEN 11 AND 100 THEN 'between 11 and 100'
         WHEN unit_count BETWEEN 101 AND 1000 THEN 'between 101 and 1000'
         WHEN unit_count BETWEEN 1001 AND 10000 THEN 'between 1001 and 10000'
         WHEN unit_count BETWEEN 10001 AND 100000 THEN 'between 10001 and 100000'
         WHEN unit_count BETWEEN 100001 AND 1000000 THEN 'between 100001 and 1000000'
         ELSE 'NA'
    END 
FROM beta.asset_transaction)

SELECT transaction_group, count(*)
FROM transaction_collapsed
GROUP BY transaction_group
ORDER BY transaction_group, count(*) DESC;

查询结果:

Screenshot of query results in count categorizing individual transaction

在按unit_countaccount_id 进行分类之前,我可以做一个查询吗?

account_id 是 uuid,unit_count 是数字

【问题讨论】:

  • mysql 还是 postgresql?他们是不同的
  • 运行SHOW CREATE TABLE asset_transaction; 并将结果发布到您的问题中。此外,添加可以代表您正在寻找的结果的示例数据。使用dbfiddle 创建示例。
  • @ProGu Postgresql.

标签: sql postgresql psql


【解决方案1】:

你只需要分组两次。如果您想要更清晰,您可以添加另一个 CTE,但这并不是必需的:

WITH transaction_collapsed AS (
    SELECT account_id,
    CASE WHEN SUM(unit_count) <= 10 THEN 'less than or equal to 10'
         WHEN SUM(unit_count) BETWEEN 11 AND 100 THEN 'between 11 and 100'
         ...
         ELSE 'NA'
    END AS transaction_group
    FROM beta.asset_transaction
    GROUP BY account_id
)
SELECT transaction_group, count(*)
FROM transaction_collapsed
GROUP BY transaction_group,
ORDER BY transaction_group;

您会注意到我删除了第二个 ORDER BY 列,因为您的事务组(必然)是不同的,因此无论如何我们永远也不会找到它。可能你只是想ORDER BY 2 DESC

这不是您要问的,但您也可以删除 CASE 语句的重复性,因为您要查找的内容与整数的长度非常相似:


WITH transaction_collapsed AS (
    SELECT account_id,
    CASE length(GREATEST(SUM(unit_count - 1),0)::TEXT) 
        WHEN 1 THEN 'less than or equal to 10'
        WHEN 2 THEN 'between 11 and 100'
        WHEN 3 THEN 'between 101 and 1000'
        ...
        ELSE 'NA'
    END AS transaction_group
    FROM beta.asset_transaction
    GROUP BY account_id
)
SELECT transaction_group, count(*)
FROM transaction_collapsed
GROUP BY transaction_group,
ORDER BY 2 DESC;

对“在 x 和 y 之间”字符串执行类似操作可能会完全删除 CASE,但代价是使代码更难阅读。

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多