【问题标题】:How can I aggregate two classes of values in a SQL query?如何在 SQL 查询中聚合两类值?
【发布时间】:2009-09-10 17:38:25
【问题描述】:

我有一个包含间隔的表格:

CREATE TABLE tbl (
    user_id: INTEGER,
    start: TIMESTAMP,
    end: TIMESTAMP,
    billable: BOOLEAN
);

我想创建一个如下所示的视图:

user_id | billable_time | unbillable_time

我可以使用这样的查询获得这两个中的 一个

SELECT user_id, sum(end - start) AS billable_time WHERE billable = TRUE GROUP BY user_id;

但是,我需要两列,不可计费时间是等价的:

SELECT user_id, sum(end - start) AS unbillable_time WHERE billable = FALSE GROUP BY user_id;

如何将这两个值合并到一个查询中?

【问题讨论】:

    标签: sql postgresql views


    【解决方案1】:
    select user_id, sum(case billable when 1 then (end - start) end) as can_bill,
      sum(case billable when 0 then (end - start) end) as unbillable
    

    【讨论】:

    • 这给了我这个错误:错误:在“CASE”第 1 行或附近出现语法错误:...(CASE 计费 WHEN TRUE THEN 结束 - 开始 END CASE)AS p...
    • 您只需将end case 更改为end 即可。谢谢!
    • 对不起,我错误地使用了 MySQL 存储过程语法。
    【解决方案2】:
    SELECT user_id, billable, sum(end - start) AS billable_time 
    GROUP BY user_id,billable;
    

    【讨论】:

    • 这根本不是我想要的。我认为这很明显,但我想我最好澄清一下这个问题。
    • 在应用层做演示更快更简单。我的另一个答案会以牺牲速度为代价为您提供所需的布局。
    • 我同意。但是,有人告诉我“将其放入数据库”因此,要么是这个,要么是一个 cron 作业来更新具有相同结构的表。笑。
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2016-10-27
    • 2021-04-15
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多