CASE语句中每个日期只有一次SELECT值

时间:2016-09-29 18:12:04

标签: sql sql-server sql-server-2012 case

当ExtID = 24时,表T的子集,也是期望输出

   CID     SDate     Cost
    1    9/9/2016     70
    1    9/14/2016     0
    1    9/16/2016    70
    2    9/9/2016      0
    2    9/14/2016    70
    2    9/16/2016     0

我希望费用是按日期计算的,即当ExtID = 24时,给定日期的任何CID的费用必须为70,但剩余的费用应该为该给定日期的0。对于给定的日期,金额只能是70次。

查询:

SELECT 
     CID
    ,SDate
    ,CASE WHEN ExtID = 24 THEN 70 END        
FROM Table T

这显然会给我带来所有费用70.如何修改CASE表达式?

2 个答案:

答案 0 :(得分:1)

这个选择每个日期的最小CID,并为该记录分配70的成本。对于具有相同日期但具有更高CID的所有其他记录,将0指定为成本。

SELECT DISTINCT t.cid, t.sdate,
CASE WHEN t.cid = sub.cidmin THEN 70
ELSE 0 END AS cost
FROM t
LEFT JOIN
(SELECT sdate, MIN(cid) as cidmin
FROM t
GROUP BY sdate) sub
ON t.cid = sub.cidmin
AND t.sdate = sub.sdate

在这里测试:http://sqlfiddle.com/#!9/72a221/11

答案 1 :(得分:0)

您可以使用窗口功能:

SELECT 
     CID
    ,SDate
    ,CASE WHEN COUNT(*) OVER (PARTITION BY DATE ORDER BY CID ASCENDING ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 0 AND EID = 24 THEN 70 END        
FROM Table T

根据CID排序,这个日期会显示在此记录之前的多少。如果它是0那么我们就在第一个记录,所以测试你的EID并在那里坚持70(可能现在可以删除EID的测试,但是如果需要的话就把它留下来)。