【问题标题】:MySQL: aggregate data from distinct rows into other distinct rows?MySQL:将不同行的数据聚合到其他不同的行中?
【发布时间】:2016-06-30 20:55:59
【问题描述】:

我知道标题令人厌恶,但我想不出一个简洁的方式来描述我的问题。

我有一张名为onsite_notes 的表。 onsite_notes 的 PK 是一个名为 onsite_note_id 的字段。我正在尝试为每个客户添加所有笔记的时间。目前,我的查询正在返回某些行的双重条目。我不知道为什么,但这真的很烦人。我想要做的是计算具有特定 FK(customer_id)的不同行。这是当前查询。

SELECT c.searchable_name, co.*, sum(n.time) 
        as worked_hours_onsite, 'onsite' as type 
            FROM customers c 
              LEFT JOIN contracts co on c.customer_id = co.customer_id 
              LEFT JOIN onsite_tickets t ON t.customer_id = c.customer_id 
              LEFT JOIN onsite_notes n ON t.onsite_id = n.onsite_id 
                      and (n.date >= 1464760800) 
                      and (n.date < 1467352800) 
                      and (n.isbillable = 1) 
           WHERE co.contract_type != '' AND 
               ((timestamp(now()) between co.start_date and co.end_date) 
            OR ((timestamp(now()) <= co.end_date) AND (co.start_date = 0)) 
            OR ((timestamp(now()) >= co.start_date) AND (co.end_date = 0)) 
            OR ((co.start_date = 0) AND (co.end_date=0))) 
           GROUP BY c.customer_id DESC ) ....

这就是事情的总体思路。它有一个工会位,但它让我同样头痛。基本上,我如何确保为每个客户获得唯一的行?我的客户行是唯一的,但聚合数据不是唯一的,我希望它是唯一的。

【问题讨论】:

  • 您要加入的其中一个表对于每个客户 ID 有两行,因此当您使用 onsite_notes 加入时,行数会增加一倍。你能展示一些产生不良结果的样本数据吗?
  • 有趣的故事。所以,我让一个比我熟练得多、知识渊博的同事看了看。鉴于表本身的数据是正确的,SQL 确实有效。你是 100% 正确的。问题是行在某种程度上是不唯一的。我们最终把一切都整理好了。感谢您的帮助!

标签: mysql distinct aggregate-functions


【解决方案1】:

如果你想要一个总和,你需要一个基于你想要分组的行的适当分组,如果你选择了列,你必须将分组减少到你想要选择的行

.. 如果您需要不同的,请不要使用 group by

最后一个 group by 不需要 desc .. desc i for order by 所以查询应该是这样的

 SELECT c.searchable_name, co.*, sum(n.time) 
    as worked_hours_onsite, 'onsite' as type 
        FROM customers c 
          LEFT JOIN contracts co on c.customer_id = co.customer_id 
          LEFT JOIN onsite_tickets t ON t.customer_id = c.customer_id 
          LEFT JOIN onsite_notes n ON t.onsite_id = n.onsite_id 
                  and (n.date >= 1464760800) 
                  and (n.date < 1467352800) 
                  and (n.isbillable = 1) 
       WHERE co.contract_type != '' AND 
           ((timestamp(now()) between co.start_date and co.end_date) 
        OR ((timestamp(now()) <= co.end_date) AND (co.start_date = 0)) 
        OR ((timestamp(now()) >= co.start_date) AND (co.end_date = 0)) 
        OR ((co.start_date = 0) AND (co.end_date=0))) 
       GROUP BY c.searchable_name, co.*

【讨论】:

  • 组正确。它在 customer_id 上,这是我的数据的排序方式。问题是我需要在该数据子集中获取不同的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2022-01-23
  • 2016-01-21
  • 2016-05-01
相关资源
最近更新 更多