2017-10-15 124 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

相關問題