2017-10-15 64 views
0

对于这篇长文章我很抱歉。这是一些使得它很长的案例陈述。如何根据另一列的值过滤一列?

我有两个问题。首先是 - 我如何从一个表中获取所有值,但是也要在自加入中对其自身进行过滤?具体而言,我计算了每天拨打销售人员的电话数量,并且我的输出保持截止时间为凌晨12点和凌晨1点。

第二个问题是 - 如何根据另一列的值过滤一列?

我的一些销售人员在纽约,所以我想说当created_by LIKE'Johnny Smith'然后从TIME减去3。不知道该怎么做!

这里是我的example--

这是我的查询看起来像...

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 

对于上下文中,先加入是过滤掉的任务,所以我一下就完成的呼叫。第二次加入是为了摆脱坏/假帐户,第三次加入是确保它只从“活动销售人员”列表中提取姓名。

这里是什么我的源数据看起来像一个例子 -

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 

我看起来就像这样 -

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 

但我希望它看起来像 -

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 
+0

这是写在MySQL – Sebastian

回答

0
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)你可以替换

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

而且也是为了通过别名case语句,而不是为了通过

2)在查询编写逻辑是有条件在外部查询中,(subquery.account_id__CaseSafe_ IS NULL)

但是案例安全在样本数据中12 AM的时间不为空。所以它被滤除了。

3)如果你想改变跨时区的时间,然后用

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

这是真棒,谢谢。我在哪里说,如果陈述? – Sebastian

+0

SELECT(如果name = “约翰尼史密斯”, DATE_FORMAT(DATE_ADD(task1.time,INTERVAL 3 HOUR)+ 3, “%1%P”), DATE_FORMAT(task1.time + 3, “%1%P” ))如小时 – Valli

相关问题