2014-09-19 63 views
1

我有兩張表,一張是任務列表。每個任務(行)由唯一一對story_idpos_id(銷售點ID)指定,幷包含日期last_completed。另一張表是priority號碼的POS清單。如何在SUM中使用CASE中的WHERE子句?

這就是我需要:我會打電話給每個任務x包括自去年完成由它的POS優先數除以時間量。我需要所有故事POS的每個故事的所有x的總和。

最重要的是,一些任務從未完成,所以last_completedNULL;對於這些任務,我想設置x分至10

這是我試過,但我得到一個錯誤的WHERE

SELECT t.story_id, SUM(
    CASE 
    WHEN t.last_completed IS NULL THEN 10 
    ELSE DATEDIFF(NOW(), t.last_completed)/p.priority 
    END 
WHERE t.pos_id = p.id) AS weeks 
FROM test_task t, test_pos p 
GROUP BY story_id; 

我也試過在同一行的WHERE條款ELSE,但那也沒用。

有誰能告訴我如何關聯priority與日期CASE裏面的SUM

+0

我們預計這將產生一個錯誤,'WHERE'條款是無效的,你擁有它; WHERE子句遵循'FROM'子句。我強烈建議您拋棄連接操作的舊式逗號語法,並改爲使用JOIN關鍵字,並將連接謂詞從WHERE子句移動到ON子句。 (請參閱Gordon的答案) – spencer7593 2014-09-19 15:36:10

+0

謝謝。穆里尼克提出了第一點,而且更有禮貌。不知道你爲什麼批評我爲「連接操作的舊式逗號語法」。 – JohnK 2014-09-19 17:48:36

回答

3

據推測,這是您要查詢的:

SELECT t.story_id, 
     SUM(CASE WHEN t.last_completed IS NULL THEN 10 
       ELSE DATEDIFF(NOW(), t.last_completed)/p.priority 
      END) as weeks 
FROM test_task t JOIN 
    test_pos p 
    ON t.pos_id = p.id 
GROUP BY story_id; 

你的條件應該是on子句中一個明確join。這與select子句中的case表達式無關。

0

您對您的條款有誤 - from應該在where之前出現。此外,您需要關閉sum的括號:

SELECT t.story_id, SUM(
    CASE 
    WHEN t.last_completed IS NULL THEN 10 
    ELSE DATEDIFF(NOW(), t.last_completed)/p.priority 
    END) AS weeks 
FROM test_task t, test_pos p 
WHERE t.pos_id = p.id 
GROUP BY story_id; 
+0

謝謝。實際上,我將WHERE *併入了SUM子句,這就是爲什麼SUM的右括號在WHERE之後。是的,我知道這行不通,而且很瘋狂。 – JohnK 2014-09-19 17:49:50