首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带CASE的mysql COUNT()

带CASE的mysql COUNT()
EN

Stack Overflow用户
提问于 2016-10-19 12:52:25
回答 3查看 2K关注 0票数 2

我遇到了这个查询如何返回数据的问题。timestamp返回正确,newpost返回正确,但已解决的post和封闭post返回不正确。我遇到的问题是,我今天遇到了一个例子,今天有人关闭了一堆票,但是因为它们比过去7天里发现的更老(这是为了图表),它没有计算它们,因为我使用的是按组创建的顺序。创建的对象是它被创建的日期,它被用作图表的timestamp、票据的创建时间以及newpost

一天结束时,第18届奥运会应该有12 newposts,1 solved和22 closed,但它不起作用。

代码语言:javascript
复制
SELECT
  DATE(created) timestamp,
  COUNT(created) newpost,
  COUNT(CASE WHEN DATE(closed) AND (sent = 0 OR sent = 1) THEN closed END) solvedpost,
  COUNT(CASE WHEN DATE(closed) AND (sent = 2) THEN closed END) closedpost
FROM 
  tickets
GROUP BY DATE(created)
ORDER BY DATE(created) DESC
LIMIT 7

样本数据:票

代码语言:javascript
复制
| post_id| sent |     created      |        closed  
| 546nby | 2 | 2016-09-23 19:58:46 | 2016-10-18 19:00:53 | 
| 540r72 | 2 | 2016-09-22 19:33:07 | 2016-10-18 18:00:56 | 
| 54jjc2 | 2 | 2016-09-26 07:41:45 | 2016-10-18 18:00:54 | 
| 5720p8 | 2 | 2016-10-12 02:55:35 | 2016-10-18 18:00:52 | 
| 57a5qo | 2 | 2016-10-13 13:09:54 | 2016-10-18 18:00:50 | 
| 4zp83k | 2 | 2016-08-26 15:40:55 | 2016-10-18 14:00:47 | 
| 4zpu3c | 2 | 2016-08-26 17:36:19 | 2016-10-18 14:00:45 | 
| 545qvv | 2 | 2016-09-23 17:03:08 | 2016-10-18 13:01:17 | 
| 5475fv | 2 | 2016-09-23 21:41:17 | 2016-10-18 13:01:15 | 
| 549u2z | 2 | 2016-09-24 12:01:35 | 2016-10-18 13:01:13 | 
| 54ct4l | 2 | 2016-09-25 00:07:39 | 2016-10-18 13:01:11 | 
| 54gksl | 2 | 2016-09-25 19:07:58 | 2016-10-18 13:01:09 | 
| 54ippx | 2 | 2016-09-26 03:15:33 | 2016-10-18 13:01:07 | 
| 54mxvf | 2 | 2016-09-26 21:09:21 | 2016-10-18 13:01:05 | 
| 54yhfh | 2 | 2016-09-28 20:35:32 | 2016-10-18 13:01:03 | 
| 55gxw7 | 2 | 2016-10-02 04:58:23 | 2016-10-18 13:01:01 | 
| 55l2sz | 2 | 2016-10-03 00:11:01 | 2016-10-18 13:00:59 | 
| 55ozq6 | 2 | 2016-10-03 18:04:24 | 2016-10-18 13:00:57 | 
| 55txmx | 2 | 2016-10-04 15:09:11 | 2016-10-18 13:00:55 | 
| 55vi46 | 2 | 2016-10-04 20:06:39 | 2016-10-18 13:00:53 | 
| 55yw80 | 2 | 2016-10-05 10:56:29 | 2016-10-18 13:00:51 | 
| 561wzj | 2 | 2016-10-05 21:26:43 | 2016-10-18 13:00:49 | 
| 56fzlm | 0 | 2016-10-08 07:25:22 | 2016-10-18 13:00:45 | 
| 56sjln | 1 | 2016-10-10 15:34:01 | 2016-10-18 01:00:48 | 
| 57luzw | 1 | 2016-10-15 12:34:50 | 2016-10-17 18:00:44 | 
| 56tlp8 | 1 | 2016-10-10 18:44:46 | 2016-10-17 16:00:44 | 
| 578e6y | 0 | 2016-10-13 03:56:29 | 2016-10-17 05:00:47 | 
| 56931q | 1 | 2016-10-07 02:01:46 | 2016-10-17 04:00:44 | 
| 55wjpf | 1 | 2016-10-04 23:38:30 | 2016-10-16 23:00:47 | 
| 56tye6 | 1 | 2016-10-10 19:45:46 | 2016-10-16 23:00:45 | 
| 56wvge | 1 | 2016-10-11 07:07:50 | 2016-10-16 23:00:43 | 
| 57sfd6 | 2 | 2016-10-16 17:16:28 | 2016-10-16 18:00:36 |

@drapp

代码语言:javascript
复制
Results
---
| timestamp | newpost | solvedpost | closedpost |  
| 2016-10-19 | 4 | 0 | 0 | 
| 2016-10-18 | 12 | 0 | 0 | 
| 2016-10-17 | 8 | 0 | 0 | 
| 2016-10-16 | 6 | 0 | 1 | 
| 2016-10-15 | 8 | 1 | 0 | 
| 2016-10-14 | 11 | 2 | 1 | 
| 2016-10-13 | 12 | 3 | 1 | 

断续查询结果

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-19 13:13:22

好吧,我想我明白你想要什么,我会澄清的。希望我的文章也能帮助你解释未来的帖子。

对于您的数据,您有票证创建时,何时关闭,以及如何关闭的状态。

我需要根据活动的每一天检索一份摘要。因此,即使一张票可能已经创建在10月9日和10月18日关闭,我需要关闭日期活动出现在第18简要记录。

要做到这一点,您需要一个子查询来获取所有已关闭的活动摘要,以及基于所讨论的日期的主活动。但现在,如果你有一个日期,没有创造门票,但有些已经关闭.我知道,异常情况,我不想质疑。

因此,调整后的查询如下

代码语言:javascript
复制
SELECT
      DATE(T1.created) DateActivity,
      COUNT(T1.*) newpost,
      MAX( COALESCE( ClosedActivity.ClosedEntries, 0 )) as ClosedEntries,
      MAX( COALESCE( ClosedActivity.ClosedPost, 0 )) as ClosedPosts,
      MAX( COALESCE( ClosedActivity.SolvedPost, 0 )) as SolvedPosts
   FROM 
      tickets T1
         LEFT JOIN 
         ( select 
                 DATE( closed ) DateClosed,
                 COUNT(*) as ClosedEntries,
                 SUM( case when sent = 2 then 1 else 0 end ) as ClosedPost,
                 SUM( case when sent = 0 OR sent = 1 then 1 else 0 end ) as SolvedPost
              from
                 tickets
              where
                 closed >= date_add( current_date(), interval -7 day )
              GROUP BY 
                 DATE(closed) ) ClosedActivity
            ON 
               DATE( T1.Created ) = ClosedActivity.DateClosed
   where
      T1.created >= date_add( current_date(), interval -7 day )
   GROUP BY 
      DATE(T1.created)
   ORDER BY 
      DATE(T1.created) DESC
   LIMIT 7

注意,我应用了日期数学,从当前数据中减去7天。通过这种方式,它只能在过去7天内捕获创建票证的活动。如果你的数据有数年的数据,它会把所有的数据都消化掉,然后只返回最近的7天,我只从最后7天开始。

因为关闭的票永远不能早于它创建的时候,所以在7天内它是合格的。

因此,对于内部查询中的每个日期的单个行,我将应用该结果的MAX(),因为它不会根据创建的票证的外部条目的数量而改变。否则,引擎可能会对不属于group by子句而不是聚合列的列进行唠叨。

我想这就是你要找的。

票数 1
EN

Stack Overflow用户

发布于 2016-10-19 12:57:51

日期(关闭)返回日期而不是布尔值,您应该考虑如下:

代码语言:javascript
复制
closed>=curdate()

若要讨论今天的日期并避免通过函数运行字段值,请执行以下操作

票数 0
EN

Stack Overflow用户

发布于 2016-10-20 00:02:31

变化

代码语言:javascript
复制
COUNT(CASE WHEN DATE(closed) AND (sent = 2) THEN closed END) closedpost

代码语言:javascript
复制
SUM(DATE(closed) = DATE(created) AND (sent = 2)) closedpost

(另一个柜台也是。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40131939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档