简体   繁体   English

如何根据另一列的值过滤一列?

[英]How do I filter one column based on the values of another column?

I apologize in advanced for the long post. 对于长篇文章,我深表歉意。 It's a couple of case statements that make it really long. 这是几个案例陈述,使它变得很长。

I have two questions. 我有两个问题。 The first is -- how do I get all the values from a table, but also filter it against itself in a self join? 第一个是-我如何从表中获取所有值,又如何在自联接中针对自身过滤呢? Specifically, I am counting the number of calls salespeople made per day and my output keeps cutting off 12am and 1am. 具体来说,我计算的是推销员每天的通话次数,而我的输出则持续减少凌晨12点和凌晨1点。

The second question is -- how do I filter one column based on the values of another column? 第二个问题是-如何根据另一列的值过滤一列?

Some of my salespeople are in New York, so I want to say when created_by LIKE 'Johnny Smith' THEN subtract 3 from TIME. 我的一些销售人员在纽约,所以我想说当created_by LIKE'Johnny Smith'然后从TIME中减去3时。 No clue how to do that! 不知道该怎么做!

Here's my example-- 这是我的例子

This is what my query looks like... 这就是我的查询的样子...

SELECT  CASE
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 1 THEN '1am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 2 THEN '2am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 3 THEN '3am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 4 THEN '4am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 5 THEN '5am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 6 THEN '6am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 7 THEN '7am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 8 THEN '8am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 9 THEN '9am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 10 THEN '10am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 11 THEN '11am'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 12 THEN '12pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 13 THEN '1pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 14 THEN '2pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 15 THEN '3pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 16 THEN '4pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 17 THEN '5pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 18 THEN '6pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 19 THEN '7pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 20 THEN '8pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 21 THEN '9pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 22 THEN '10pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 23 THEN '11pm'
           WHEN (EXTRACT(HOUR
                         FROM task1.time)) = 0 THEN '12am'
       END AS hour,
       COUNT(task2.Activity_ID__Case_Safe_) AS calls
FROM sdr_data.by_task AS task1
LEFT JOIN sdr_data.by_task AS task2
  ON task1.Activity_ID__Case_Safe_ = task2.Activity_ID__Case_Safe_
  AND task2.task_type LIKE 'Call'
  AND task2.status LIKE 'Completed'
  AND task2.created_date > DATE_SUB(CURRENT_DATE(), INTERVAL 1
                                    WEEK)
LEFT JOIN
  (SELECT account_id__CaseSafe_
   FROM sdr_data.by_task
   WHERE account_id__CaseSafe_ IN
       (SELECT account_id__CaseSafe_
        FROM {{@dummy_accounts}})) AS subquery
  ON task2.account_id__CaseSafe_ = subquery.account_id__CaseSafe_
RIGHT JOIN
  (SELECT created_by,
          Activity_ID__Case_Safe_
   FROM sdr_data.by_task
   WHERE created_by IN
       (SELECT full_name
        FROM {{@active_salespeople}}) ) AS subquery2
  ON task1.Activity_ID__Case_Safe_ = subquery2.Activity_ID__Case_Safe_
WHERE task1.created_by IS NOT NULL
  AND subquery.account_id__CaseSafe_ IS NULL
GROUP BY 1
ORDER BY CASE
             WHEN HOUR LIKE '12am' THEN 1
             WHEN HOUR LIKE '1am' THEN 2
             WHEN HOUR LIKE '2am' THEN 3
             WHEN HOUR LIKE '3am' THEN 4
             WHEN HOUR LIKE '4am' THEN 5
             WHEN HOUR LIKE '5am' THEN 6
             WHEN HOUR LIKE '6am' THEN 7
             WHEN HOUR LIKE '7am' THEN 8
             WHEN HOUR LIKE '8am' THEN 9
             WHEN HOUR LIKE '9am' THEN 10
             WHEN HOUR LIKE '10am' THEN 11
             WHEN HOUR LIKE '11am' THEN 12
             WHEN HOUR LIKE '12pm' THEN 13
             WHEN HOUR LIKE '1pm' THEN 14
             WHEN HOUR LIKE '2pm' THEN 15
             WHEN HOUR LIKE '3pm' THEN 16
             WHEN HOUR LIKE '4pm' THEN 17
             WHEN HOUR LIKE '5pm' THEN 18
             WHEN HOUR LIKE '6pm' THEN 19
             WHEN HOUR LIKE '7pm' THEN 20
             WHEN HOUR LIKE '8pm' THEN 21
             WHEN HOUR LIKE '9pm' THEN 22
             WHEN HOUR LIKE '10pm' THEN 23
             WHEN HOUR LIKE '11pm' THEN 24
         END

For context, the first join is to filter out the tasks so I just get completed calls. 对于上下文,第一个联接是过滤掉任务,因此我只需要完成呼叫。 The second join is to get rid of bad/fake accounts and the third join is to make sure it only pulls names from the "active-salespeople" list. 第二个连接是摆脱不良/虚假帐户,第三个连接是确保仅从“活跃销售人员”列表中提取名称。

Here's an example of what my source data looks like -- 这是我的源数据看起来像的一个例子-

Created By  Task Type   Time    Status  Activity ID (Case Safe)
Rudolph Ronald  Call    2015-12-21 12:56:00 Completed   61AA
Joey Jalla  Call    2015-12-21 12:56:00 Completed   61BB
Mike McCrystal  Call    2015-12-21 12:56:00 Completed   61CC
Sally Susie Email   2015-12-21 12:56:00 Open    61DD
Sally Susie Email   2015-12-21 12:56:00 Open    61EE
Sally Susie Meeting 2015-12-21 12:56:00 Completed   61FF

My output looks like this -- 我的输出看起来像这样-

hour    calls
2am 5
3am 14
4am 8
5am 20
6am 52
7am 55
8am 145
9am 90
10am    106
11am    93
12pm    96
1pm 53
2pm 54
3pm 43
4pm 20
5pm 8
6pm 4
7pm 17
8pm 9
9pm 12
11pm    6

But I want it to look like -- 但我希望它看起来像-

hour    calls
12am    2
1am 4
2am 5
3am 14
4am 8
5am 20
6am 52
7am 55
8am 145
9am 90
10am    106
11am    93
12pm    96
1pm 53
2pm 54
3pm 43
4pm 20
5pm 8
6pm 4
7pm 17
8pm 9
9pm 12
11pm    6
SELECT DATE_FORMAT(task1.time, "%l%p") hour,
       COUNT(task2.Activity_ID__Case_Safe_) AS calls
 YOUR REST OF THE QUERY 
GROUP BY 1
ORDER BY hour

1) You can replace the case statement with 1)您可以将case语句替换为

DATE_FORMAT(task1.time, "%l%p") ---This gives hour in AM/PM

And also order by alias rather than writing the logic in order by 而且也要按别名排序,而不是按

2) In your query there is a condition in the outer query , (subquery.account_id__CaseSafe_ IS NULL) 2)在您的查询中,外部查询中有一个条件, (subquery.account_id__CaseSafe_ IS NULL)

But case safe is not null for the time 12 AM in the sample data. 但是在示例数据中,对于上午12点的时间,案例安全性不为null。 So it is getting filtered out. 因此,它已被过滤掉。

3) If you want to change time across timezone then use 3)如果您想更改时区的时间,请使用

if name = "Johnny Smith", 
     DATE_FORMAT(date_add(task1.time,  INTERVAL 3 HOUR) + 3, "%l%p") , 
     DATE_FORMAT(task1.time + 3, "%l%p"))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 根据另一个表列中的值过滤一个表 - Filter one table based on values from another table column MySQL:如何从一列返回所有唯一值,同时匹配另一列中的值 - MySQL: How do I return all unique values from one column while matching values in another column mysql-如何使用AND在基于另一列的一个表列中查找公用值? - mysql - How can I find common values in one table column based on another column using AND? 如何创建基于另一列中的多个值的新列? - How do I create a new column that is based on multiple values in another column? 如何根据另一列的值获得一列的平均值? - How do I get an average of one column based on the value of another column? 我如何通过多个值过滤一列(严格过滤器)? - How i can filter one column by multiple values (strict filter)? 如何在保留另一列中的值的同时连接一列上的两个表? - How do I join two tables on one column while preserving the values in another column? MySQL:如何在一个列中获取AVG值,以便在另一列中共享不同值的条目? - MySQL: How do I get the AVG value in one column for entries sharing distinct values in another column? 根据另一列的值过滤一列上的多个值 - filtering for multiple values on one column based on values from another column 如何按一列过滤而按另一列排序? - How can I filter by one column whilst sorting by another?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM