【问题标题】:SQL, counting on the same table, multiple partition typesSQL,指望同一张表,多种分区类型
【发布时间】:2021-01-03 10:49:33
【问题描述】:

我正在尝试查询一个共享许多实体类型(Ticket、TicketNote、TimeEntry、Resource 等)的表。 当我运行多个内部联接时,计数总是返回相同的数据。 我在下面设计的查询有效,但这是最好的方法吗?

select 
    ticket.data ->> 'TicketNumber',
    ticket.data ->> 'Title',
    count(case when entry.name='TicketNote' then 1 end) notes,
    count(case when entry.name='TimeEntry' then 1 end) times,
    sum(case when entry.name='TimeEntry' then (entry.data ->> 'HoursToBill')::numeric else 0 end) hours_to_bill
from caches ticket
inner join caches entry
on (entry.data ->> 'TicketID')::numeric = ticket.aid and (entry.name = 'TimeEntry' or entry.name = 'TicketNote')
where 
    ticket.name = 'Ticket'
group by ticket.data
order by hours_to_bill desc;

我在 SQL 方面比较熟练。

我欣赏任何智慧。

谢谢!

【问题讨论】:

  • ->> 是什么意思?方法调用?
  • ->> 是一个 jsonb 操作符 jsonb docs "Get JSON object field as text"
  • 好吧,我明白了。谢谢

标签: sql postgresql join count sum


【解决方案1】:

我希望是这样的:

select ticket.data ->> 'TicketNumber' as ticketNumber,
       ticket.data ->> 'Title' as title,
       count(*) filter (where entry.name = 'TicketNote') as notes,
       count(*) filter (where entry.name = 'TimeEntry') as times,
       sum((entry.data ->> 'HoursToBill')::numeric) filter (where entry.name = 'TimeEntry') as hours_to_bill
from caches ticket inner join
     caches entry
     on (entry.data ->> 'TicketID')::numeric = ticket.aid and
        (entry.name = 'TimeEntry' or entry.name = 'TicketNote')
where ticket.name = 'Ticket'
group by ticketnumber, title
order by hours_to_bill desc;

这实际上只是对您的查询的调整。它使用更现代的filter 语法——有时会更高效。而且聚合标准更加明确。

【讨论】:

  • 非常感谢!我完全不知道这种语法。我还会记下您是如何修复我的空白格式的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多