如何在SUM中使用带有CASE的WHERE子句?

时间:2014-09-19 15:01:01

标签: mysql sql case

我有两张桌子,一张是任务清单。每个任务(行)由一对唯一的story_idpos_id(销售点ID)指定,并包含日期last_completed。另一个表是具有priority号码的POS列表。

这就是我需要的:我将为每个任务x调用包含自上次完成以来的时间除以其POS优先级编号的数量。我需要每个故事的所有x的总和超过所有故事的POSes。

最重要的是,有些任务从未完成,因此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子句,但这也没有用。

有人可以告诉我如何将prioritylast_completedCASE内的SUM日期相关联吗?

2 个答案:

答案 0 :(得分: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的{​​{1}}子句中。这与join子句中的case表达式无关。

答案 1 :(得分: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;